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"));
    }
}