OffsetDateTime工具类
java8时间API介绍及使用
java7及之前版本,推荐使用jodatime
java8提供的datetime api参考了jodatime
在新的时间API中,
Instant表示一个精确的时间点,
Duration和Period表示两个时间点之间的时间量。 LocalDate表示日期,即xx年xx月xx日,
即不包括时间也不带时区。LocalTime与LocalDate类似。
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"));
    }
}
OffsetDateTime工具类的更多相关文章
- Java8 ,LocalDate,LocalDateTime处理日期和时间工具类,
		Java8 ,LocalDate,LocalDateTime处理日期和时间工具类 1.获取今天的日期 2.在Java 8 中获取年.月.日信息 3.在Java 8 中处理特定日期 4.在Java 8 ... 
- Java基础Map接口+Collections工具类
		1.Map中我们主要讲两个接口 HashMap 与 LinkedHashMap (1)其中LinkedHashMap是有序的 怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ... 
- Android—关于自定义对话框的工具类
		开发中有很多地方会用到自定义对话框,为了避免不必要的城府代码,在此总结出一个工具类. 弹出对话框的地方很多,但是都大同小异,不同无非就是提示内容或者图片不同,下面这个类是将提示内容和图片放到了自定义函 ... 
- [转]Java常用工具类集合
		转自:http://blog.csdn.net/justdb/article/details/8653166 数据库连接工具类——仅仅获得连接对象 ConnDB.java package com.ut ... 
- js常用工具类.
		一些js的工具类 复制代码 /** * Created by sevennight on 15-1-31. * js常用工具类 */ /** * 方法作用:[格式化时间] * 使用方法 * 示例: * ... 
- Guava库介绍之实用工具类
		作者:Jack47 转载请保留作者和原文出处 欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 本文是我写的Google开源的Java编程库Guava系列之一,主要介 ... 
- Java程序员的日常—— Arrays工具类的使用
		这个类在日常的开发中,还是非常常用的.今天就总结一下Arrays工具类的常用方法.最常用的就是asList,sort,toStream,equals,copyOf了.另外可以深入学习下Arrays的排 ... 
- .net使用正则表达式校验、匹配字符工具类
		开发程序离不开数据的校验,这里整理了一些数据的校验.匹配的方法: /// <summary> /// 字符(串)验证.匹配工具类 /// </summary> public c ... 
- WebUtils-网络请求工具类
		网络请求工具类,大幅代码借鉴aplipay. using System; using System.Collections.Generic; using System.IO; using System ... 
随机推荐
- MySQL:对于几个测试题的详细研究
			最近在做MySQL作业时候遇到了很多问题,MySQL作业链接:https://www.cnblogs.com/wj-1314/p/9213885.html 所以下面谈一下稍微难一点的数据库问题,我们需 ... 
- 探秘 Java 热部署
			# 前言 在之前的 深入浅出 JVM ClassLoader 一文中,我们说可以通过修改默认的类加载器实现热部署,但在 Java 开发领域,热部署一直是一个难以解决的问题,目前的 Java 虚拟机只能 ... 
- ORM框架EF
			应用程序和数据库采用Tcp协议通讯 ORM框架有: NHibernate ,Dapper ,Mybatis 底层是 ADO.Net 好处: 1.面向对象 2.没有sql减少学习成本,快速开发 3.编译 ... 
- yarn 工作原理(2)
			1.client向yarn提交job,首先找ResourceManager分配资源, 2.ResourceManager开启一个Container,在Container中运行一个Application ... 
- Hive原理总结(完整版)
			目录 课程大纲(HIVE增强) 3 1. Hive基本概念 4 1.1 Hive简介 4 1.1.1 什么是Hive 4 1.1.2 为什么使用Hive 4 1.1.3 Hive的特点 4 1.2 H ... 
- url字符长度限制解决办法
			前段时间,同事往系统上传相关文档,发现输入失败,找到了我了. 开始以为数据库字段属性问题,修改后未解决随调试系统,发现没有走到后台程序,发现 ajax没有传值,各种测试问题情况,后来同事发现是url字 ... 
- [android] 手机卫士手机定位的原理
			手机定位的三种方式:网络定位,基站定位,GPS定位 网络定位,手机连上wifi 2g 3g的时候,手机会有一个ip,误差很大 基站定位,精确度与基站的多少有关,几十米到几公里的误差 GPS定位,至少需 ... 
- vue按需引入element或mint
			vue按需引入element或mint需要添加 babel-preset-es2015 和babel-plugin-component 
- 如何在表单中使用Ajax
			1.HTML就是一个简单表单验证,有登录按钮,点击登录会发送Ajax, 这里就是简单如果用户名为:zhouzhiruo,密码为:123456,就是登录成功,否则登录失败 应该在发送请求之前对input ... 
- Apache SkyWalking的架构设计【译文】
			Apache SkyWalking提供了一个功能强大并且很轻量级的后端.在此,将介绍为什么采用以下方式来设计它,以及它又是如何工作的. 架构图 对于APM而言,agent或SDKs仅是如何使用libs ... 
