zoukankan      html  css  js  c++  java
  • OffsetDateTime工具类

     

    java8时间API介绍及使用

    java7及之前版本,推荐使用jodatime
    java8提供的datetime api参考了jodatime

    在新的时间API中,

    Instant表示一个精确的时间点,

    DurationPeriod表示两个时间点之间的时间量。 
    LocalDate表示日期,即xx年xx月xx日,

    即不包括时间也不带时区。LocalTimeLocalDate类似

    LocalDateTime则包含日期和时间。

    OffsetDateTime表示一个带ZoneOffset的时间。

    ZoneDateTime表示一个带时区的时间。 
    DateTimeFormatter提供格式化和解析功能。

    java8的时间api解析网上很多,不详细展开了。

    下图来自百度:

    由于项目需要,需要将时间全部改造为GMT格式,即带时区的时间格式

    不同时区的同一时刻的时间戳都是一样的,即时间戳都是不同时区相对于1970年的间隔绝对值,2016-10-10T20:00:00.000+1:00与2016-10-10T23:00:00.000+4:00的时间戳一样,表示同一时刻。所以讲string类型的时间字符串转换long型再格式化成不同时区的时间。

    以下工具类仅为参考:

    public class OffsetDateTimeTool {
    
        //private static final ZoneOffset OFFSET_ID = ZoneOffset.of("+08:00");
        private static final ZoneOffset OFFSET_ID = getOFFSET_ID();
        /**
         * String  转 OffsetDateTime
         */
        public static String getZoneStringDateTime(CharSequence text){
           return formatDateTime(OffsetDateTime.of(LocalDateTimeTool.parseTime(text.toString()),OFFSET_ID)
           ,TimeFormat.LONG_DATE_PATTERN_WITH_TIME_ZONE.value());
        }
        /**
         * String 转 OffsetDateTime 转 long 转 OffsetDateTime 格式化 String
         */
        public static String getStringDateTime(CharSequence text) {
          return formatDateTime(OffsetDateTime.ofInstant(Instant.ofEpochMilli(getLongDateTime(text
                  ,TimeFormat.LONG_DATE_PATTERN_WITH_TIME_ZONE.value(),getOffset(text.toString()))),OFFSET_ID)
                  ,TimeFormat.LONG_DATE_PATTERN_LINE.value());
        }
        /**
         * String 转 OffsetDateTime 转 long
         */
        public static long getLongDateTime(CharSequence text, String patten, String offsetId) {
            return getLong(parse(text,patten,offsetId))*1000;
        }
        /**
         * OffsetDateTime 转 long
         */
        public static long getLong(OffsetDateTime offsetDateTime) {
            return offsetDateTime.getLong(ChronoField.INSTANT_SECONDS);
        }
        /**
         * 根据字符串设置日期
         *
         * @return OffsetDateTime
         */
        public static OffsetDateTime parse(CharSequence text, String patten, String offsetId) {
            LocalDateTime localDateTime = LocalDateTime.parse(text, DateTimeFormatter.ofPattern(patten));
            return OffsetDateTime.of(localDateTime, ZoneOffset.of(offsetId));
        }
        /**
         * 格式化时间
         */
        public static String formatDateTime(OffsetDateTime dateTime, String patten) {
            return dateTime.format(DateTimeFormatter.ofPattern(patten));
        }
        /**
         * 获取系统时区
         */
        public static ZoneOffset getOFFSET_ID(){
            return LocalDateTime.now(ZoneOffset.systemDefault()).atZone(ZoneOffset.systemDefault()).getOffset();
        }
        /**
         * 获取string时区
         */
        public static String getOffset(String date){
            return date.substring(date.length()-6,date.length());
        }
        /**
         * 获取当前时间 在ISO-8601日历系统中的UTC /格林威治偏移的日期时间,如2017-12-03T10:15:30+08:00
         */
        public static OffsetDateTime getDateTimeNow() {
            return OffsetDateTime.now();
        }
        /**
         * 获取时间(只设置年月日)
         */
        public static OffsetDateTime getDateTime(int year, int month, int day , String offsetId) {
            return getDateTime(year, month, day, 0, 0, 0, 0 , ZoneOffset.of(offsetId));
        }
        /**
         * 获取时间
         *
         * @param year
         *            年
         * @param month
         *            月
         * @param day
         *            日
         * @param hour
         *            时
         * @param minute
         *            分
         * @param second
         *            秒
         * @param nanoOfSecond
         *            纳秒
         * @param zoneOffset
         *            时区
         * @return OffsetDateTime
         */
        public static OffsetDateTime getDateTime(int year, int month, int day, int hour, int minute, int second,
                                                 int nanoOfSecond, ZoneOffset zoneOffset) {
            return OffsetDateTime.of(year, month, day, hour, minute, second, nanoOfSecond, zoneOffset);
    
        }
        /**
         * 内部枚举类
         */
        public enum TimeFormat {
            //短时间格式 年月日
            /**
             *时间格式:yyyy-MM-dd HH:mm:ss
             */
            LONG_DATE_PATTERN_LINE("yyyy-MM-dd HH:mm:ss"),
    
            LONG_DATE_PATTERN_WITH_TIME_ZONE("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
            private String value = "";
    
            TimeFormat(String value) {
                this.value = value;
            }
    
            public String value() {
                return this.value;
            }
        }
        public static void main(String args[]) {
            System.out.println("getLongDateTime : "
                    + getLongDateTime("2018-06-05T08:00:00.000+08:00"
                    ,TimeFormat.LONG_DATE_PATTERN_WITH_TIME_ZONE.value(),getOffset("2018-06-05T04:00:00.000+08:00") ));
            System.out.println("getLongDateTime : "
                    + getLongDateTime("2018-06-05T04:00:00.000+04:00"
                    ,TimeFormat.LONG_DATE_PATTERN_WITH_TIME_ZONE.value(),getOffset("2018-06-05T04:00:00.000+04:00") ));
            System.out.println("getStringDateTime :" + getStringDateTime("2018-06-05T04:00:00.000-12:00"));
            System.out.println("getZoneStringDateTime:" + getZoneStringDateTime("2018-06-05 04:00:00"));
        }
    }
  • 相关阅读:
    【转】【python】装饰器的原理
    Common Subsequence---最长公共子序列
    N个数的全排列 -------指定排头法
    Oil Deposits----深搜问题
    Worm
    亲和串
    n个数的最小公倍数
    整除的尾数
    Substrings 子字符串-----搜索
    N的互质数----欧拉函数
  • 原文地址:https://www.cnblogs.com/aixinge/p/9145943.html
Copyright © 2011-2022 走看看