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"));
        }
    }
  • 相关阅读:
    Hihocoder 1275 扫地机器人 计算几何
    CodeForces 771C Bear and Tree Jumps 树形DP
    CodeForces 778D Parquet Re-laying 构造
    CodeForces 785E Anton and Permutation 分块
    CodeForces 785D Anton and School
    CodeForces 785C Anton and Fairy Tale 二分
    Hexo Next 接入 google AdSense 广告
    如何统计 Hexo 网站的访问地区和IP
    Design and Implementation of Global Path Planning System for Unmanned Surface Vehicle among Multiple Task Points
    通过ODBC接口访问人大金仓数据库
  • 原文地址:https://www.cnblogs.com/aixinge/p/9145943.html
Copyright © 2011-2022 走看看