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"));
        }
    }
  • 相关阅读:
    Java核心技术 卷一 笔记四 库类的直接使用
    Java核心技术 卷一 笔记三 大数值及数组
    Java核心技术 卷一 笔记2 字符串的复制
    Java核心技术 卷一 笔记1
    修改css 样式后, hover事件 不生效
    修改 element ui input 输入框 样式不生效问题
    css3 计算属性
    Vue3 改动系列
    浏览器实现,向下滑动 鼠标滚轮,页面横向移动
    linux ceont0s7 vue 打包压缩图片 一直报错
  • 原文地址:https://www.cnblogs.com/aixinge/p/9145943.html
Copyright © 2011-2022 走看看