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工具类的更多相关文章

  1. Java8 ,LocalDate,LocalDateTime处理日期和时间工具类,

    Java8 ,LocalDate,LocalDateTime处理日期和时间工具类 1.获取今天的日期 2.在Java 8 中获取年.月.日信息 3.在Java 8 中处理特定日期 4.在Java 8 ...

  2. Java基础Map接口+Collections工具类

    1.Map中我们主要讲两个接口 HashMap  与   LinkedHashMap (1)其中LinkedHashMap是有序的  怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...

  3. Android—关于自定义对话框的工具类

    开发中有很多地方会用到自定义对话框,为了避免不必要的城府代码,在此总结出一个工具类. 弹出对话框的地方很多,但是都大同小异,不同无非就是提示内容或者图片不同,下面这个类是将提示内容和图片放到了自定义函 ...

  4. [转]Java常用工具类集合

    转自:http://blog.csdn.net/justdb/article/details/8653166 数据库连接工具类——仅仅获得连接对象 ConnDB.java package com.ut ...

  5. js常用工具类.

    一些js的工具类 复制代码 /** * Created by sevennight on 15-1-31. * js常用工具类 */ /** * 方法作用:[格式化时间] * 使用方法 * 示例: * ...

  6. Guava库介绍之实用工具类

    作者:Jack47 转载请保留作者和原文出处 欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 本文是我写的Google开源的Java编程库Guava系列之一,主要介 ...

  7. Java程序员的日常—— Arrays工具类的使用

    这个类在日常的开发中,还是非常常用的.今天就总结一下Arrays工具类的常用方法.最常用的就是asList,sort,toStream,equals,copyOf了.另外可以深入学习下Arrays的排 ...

  8. .net使用正则表达式校验、匹配字符工具类

    开发程序离不开数据的校验,这里整理了一些数据的校验.匹配的方法: /// <summary> /// 字符(串)验证.匹配工具类 /// </summary> public c ...

  9. WebUtils-网络请求工具类

    网络请求工具类,大幅代码借鉴aplipay. using System; using System.Collections.Generic; using System.IO; using System ...

随机推荐

  1. ubuntu 增加一个用户 并赋予权限

    一.添加一个用户 sudo adduser tommy  //添加一个tommyd的用户 sudo passwd tommy // 修改密码 回车后出现一下提示 输入密码即可Changing pass ...

  2. vmware workstation 提示程序包可能有错,错误代码 29141 & 提示不可恢复错误: (vcpu-0)

    问题一:提示程序包可能有错,错误代码 29141 换了n个版本(vmware workstation 10,11, 12),下载了n次,都提示该错误(29141),明明程序包没错啊, 一开始还怀疑是我 ...

  3. Java并发编程之volatile关键字

    大概是因为项目.业务的原因,工作上几乎还没有使用过多线程相关的功能,相关知识差不多都忘了,所以最近补一下基础. volatile用来修饰共享变量,volatile变量具有 synchronized 的 ...

  4. Jenkins之使用Pyinstaller构建Python应用程序

    目录 1. 极简概述 2. Jenkins配置 2.1 安装JDK 2.2 安装Jenkins 3. 安装Docker 4. 使用PyInstaller构建Python应用程序 4.1 Fork 一个 ...

  5. Java并发编程笔记之ReentrantLock源码分析

    ReentrantLock是可重入的独占锁,同时只能有一个线程可以获取该锁,其他获取该锁的线程会被阻塞后放入该锁的AQS阻塞队列里面. 首先我们先看一下ReentrantLock的类图结构,如下图所示 ...

  6. TCP/IP 详解

    分层 每一层负责不同的功能:     链路层 有时也称作数据链路层或网络接口层, 通常包括操作系统中的设备驱动程序和计算机 中对应的网络接口卡.它们一起处理与电缆(或其他任何传输媒介)的物理接口细节. ...

  7. .NET实现发送邮件

    注意:需要找到“POP3/SMTP服务”并开启,然后生成授权码,生成的授权码就是下面登入的密码. /// <summary> /// 发送邮件 /// </summary> / ...

  8. 一道生成不重复随机数字的C#笔试编程题

    当时写在纸上的程序没有验证输入,出面试公司没多久就突然想起来这点了,囧啊! 不过当时笔试的时候想到写异常处理了. 回来上机整理了一下程序,才发现原来还会用到递归的. 当时面试官边说边出的题,问他数字是 ...

  9. Java基础——Oracle(六)

    一.数据字典和动态性能视图 数据字典: oracle中的重要组成部分,提供了数据库的一些系统信息,记录了数据库的系统信息,它是只读表和视图的集合,数据字典的所有者为 sys 用户.用户只能在数据字典上 ...

  10. sql语句中left join和inner join中的on与where的区别分析

    关于SQL SERVER的表联接查询INNER JOIN .LEFT JOIN和RIGHT JOIN,经常会用到ON和WHERE的条件查询,以前用的时候有时是凭感觉的,总是没有搞清楚,今日亲自测试了下 ...