下面将依次介绍

  1. Date转Java8时间类操作 ,Java8时间类LocalDate常用操作(如获得当前日期,两个日期相差多少天,下个星期的日期,下个月第一天等)
  2. 解析不同时间字符串成对应的Java8中的类,如Instant、LocalDateTime、ZonedDateTime
  3. 时区ZoneId的使用场景、方式(根据ZoneId可将普通日期时间转化带有时区的日期时间,如2018-12-07T09:33:38Z,2018-10-08T18:12:38.547+08:00[Asia/Shanghai])。

java.time包中的是类是不可变且线程安全的。

新的时间及日期API位于java.time中,下面是一些关键类

●Instant——它代表的是时间戳,注意这里默认的Instant是0时区,比北京少8个时区,例子:2018-10-08T09:50:21.852Z,相当于当天北京时间的17:50:21.852

●LocalDate——不包含具体时间的日期,比如2014-01-14。它可以用来存储生日,周年纪念日,入职日期等。

●LocalTime——它代表的是不含日期的时间

●LocalDateTime——它包含了日期及时间,不过还是没有偏移信息或者说时区。

●ZonedDateTime——这是一个包含时区的完整的日期时间,偏移量是以UTC/格林威治时间为基准的,如:2018-10-08T18:12:38.547+08:00[Asia/Shanghai]。

一个例子:给出一个时间段,计算该时间范围由哪些日期(天)和月份组成

一 、先主要是Java8中LocalDate日期的操作

1. Date转LocalDate、LocalDateTime

Date转化为Instant时间戳,然后instant和系统默认时区转化成LocalDate

/**
* Date转LocalDate: Date -> Instant + System default time zone = LocalDate
*/
@Test
public void dateToLocalDateAndLocalDateTime(){
Date date = new Date();
Instant instant = date.toInstant();
/**
* instant : 2018-10-08T09:50:21.852Z
* Zone : UTC+0
* 注意这里默认的Instant是比北京少8个时区
*/ //获得本地默认时区
ZoneId defaultZoneId = ZoneId.systemDefault(); LocalDate localDate = instant.atZone(defaultZoneId).toLocalDate();
System.out.println(localDate);
     //2018-10-08
}

Date转化成本地系统时区的LocalDateTime

@Test
public void dateToLocalDateTime(){
Date date = new Date();
Instant instant = date.toInstant();
//系统默认的时区
ZoneId zoneId = ZoneId.systemDefault();
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zoneId);
System.out.println(localDateTime);
}

2. 13位long类型转LocalDate

long -> Instant +System default time zone = LocalDate

public LocalDate longToLocalDate(Long time){

        //System Default TimeZone : Asia/Shanghai
ZoneId defaultZoneId = ZoneId.systemDefault(); //2018-01-04T16:00:00Z
//时间戳
Instant instant = Instant.ofEpochMilli(time); //2018-01-05
LocalDate localDate = instant.atZone(defaultZoneId).toLocalDate(); return localDate;
}

3. 获取现在的日期

Java8中有个叫LocalDate的类,能用来表示日期。这个类与java.util.Date略有不同,因为它只包含日期,没有时间。

4. 获取年月日

5. 判断两个日期之间相差多少天

/**
* 判断两个日期相差多少天
*/
@Test
public void localDateDiff(){
LocalDate date1 = LocalDate.of(2018,9,20);
LocalDate date2 = LocalDate.of(2018,10,3);
long l = date2.toEpochDay() - date1.toEpochDay();
System.out.println(l);
}

6. 获得某个日期所在月的第一天、最后一天

/**
* 获得某个日期所在月的第一天、最后一天
*/
@Test
public void firstLastDay(){ LocalDate localDate = LocalDate.of(2018, 2, 22);
LocalDate firstDay = localDate.with(TemporalAdjusters.firstDayOfMonth());
LocalDate lastDay = localDate.with(TemporalAdjusters.lastDayOfMonth());
System.out.println("firstDay: "+firstDay+" lastDay: "+lastDay);
//firstDay: 2018-02-01 lastDay: 2018-02-28
}

7. 某个月有多少天

先获取该月的最后一天的LocalDate,再调用getDayOfMonth()方法

 /**
* 某个月有多少天
*/
@Test
public void getDayOfMonth(){
LocalDate localDate = LocalDate.of(2018, 2, 22);
LocalDate lastDay = localDate.with(TemporalAdjusters.lastDayOfMonth());
int dayOfMonth = lastDay.getDayOfMonth();
System.out.println(dayOfMonth);
//
}

8. 比较两个LocalDate的大小

/**
* 比较两个LocalDate的大小
*/
@Test
public void localDateCompareTo(){
LocalDate date1 = LocalDate.of(2018,9,20);
LocalDate date2 = LocalDate.of(2018,10,3);
int i = date1.compareTo(date2);
System.out.println(i);
//-1 小 int i1 = date2.compareTo(date1);
System.out.println(i1);
//1 大 int i2 = date1.compareTo(date1);
System.out.println(i2);
//0 等于
}

9. 获取下一周的该星期、下个月的这天、下个月的1号

/**
* 获取下一周的该星期、下个月的这天、下个月的1号
*/
@Test
public void nextMonth(){ LocalDate localDate = LocalDate.of(2018, 2, 12); //下一周的该星期
LocalDate localDate1 = localDate.minusWeeks(-1);
System.out.println(localDate1);
//2018-02-19 //获取下个月的这天
LocalDate localDate2 = localDate.minusMonths(-1);
System.out.println(localDate2);
//2018-03-12 //下个月的1号
LocalDate localDate3 = LocalDate.of(localDate.getYear(), localDate.getMonthValue()+1, 1);
System.out.println(localDate3);
//2018-03-01
}

10. 比较两个LocalDate相差多少年、月、天

Period这个类,这里比较的是两个日期,相差多少年、多少个月、多少天;

比如下面的这个例子中,2018.10.9 比 2019.4.1相差 0年 5个月 23天

/**
* 比较两个LocalDate相差多少年、月、日
*/
@Test
public void localDatePeriod(){
LocalDate date1 = LocalDate.of(2018,10,9);
LocalDate date2 = LocalDate.of(2019,4,1);
Period period = Period.between(date1, date2);
int years = period.getYears();
int months = period.getMonths();
int days = period.getDays();
System.out.println("years:"+years+", months:"+months+", days:"+days);
//years:0, months:5, days:23
}

11. 通过10位或13位时间戳构建Instant

ofEpochSecond()参数是10位时间戳,精确到秒;

ofEpochMilli()参数是13位时间戳,精确到毫秒。

@Test
public void ofEpochSecond(){
Instant now = Instant.now();
System.out.println(now);
//2019-03-13T06:41:32.865Z //去除毫秒
long l = now.toEpochMilli() / 1000;
//通过秒构建Instant对象
Instant instant = Instant.ofEpochSecond(l);
System.out.println(instant);
//2019-03-13T06:41:32Z
}

二、 将特殊格式的字符串解析成对应的时间类

由下面例子总结

Instant只能解析"**T**Z”这种格式的时间,即UTC字符串;

ZonedDateTime解析的时间字符串必须是要有年月日时分秒以及时区;

LocalDateTime解析的时间字符串必须要有年月日时分秒,但是不能有时区,例如末尾有"Z"的时间表示UTC的0时区就不能解析;

LocalDate解析的时间字符串必须只能有年月日,格式如"2018-12-07",多任何其他字符都不能解析。

1.格式:2018-12-07T09:33:38+00:00

/**
* 解析字符串:2018-12-07T09:33:38+00:00
* ZonedDateTime必须解析有时区的时间
*/
@Test
public void stringToZonedDateTime(){
final String string ="2018-12-07T09:33:38+00:00";
ZonedDateTime parse = ZonedDateTime.parse(string);
System.out.println(parse.toString());
//结果是2018-12-07T09:33:38Z
ZoneId zone = parse.getZone();
System.out.println(zone);
}

2.2018-12-07T09:33:38Z

/**
* 解析字符串:2018-12-07T09:33:38Z,无法解析2018-12-07T09:33:38+00:00
* Instant只能解析"**T**Z”这种格式的时间
*/
@Test
public void stringToInstant(){
final String string ="2018-12-07T09:33:38Z";
Instant parse = Instant.parse(string);
System.out.println(parse);
//2018-12-07T09:33:38Z
}
/**
* 解析字符串:2018-12-07T09:33:38Z
* 表示的是0时区的时间
*/
@Test
public void stringToZonedDateTime1(){
final String string ="2018-12-07T09:33:38Z";
ZonedDateTime parse = ZonedDateTime.parse(string);
System.out.println(parse.toString());
//结果是2018-12-07T09:33:38Z
ZoneId zone = parse.getZone();
System.out.println(zone);
}

3.2018-12-07T09:33:38,末尾无Z,没有时区

 /**
* 解析字符串:2018-12-07T09:33:38,末尾不能有Z,有T有Z代表了UTC 0时区的时间,还必须要有"T时分秒"这一截字符串
* LocaDateTime无法解析带有时区的字符串时间
*/
@Test
public void stringToLocalDateTime(){
final String string ="2018-12-07T09:33:38";
LocalDateTime parse = LocalDateTime.parse(string);
System.out.println(parse.toString());
//结果是2018-12-07T09:33:38
}

4.2018-12-07

/**
* 解析字符串:2018-12-07,只能解析该格式字符串
* LocaDate无法解析带有时区的字符串时间
*/
@Test
public void stringToLocalDate(){
final String string ="2018-12-07";
LocalDate parse = LocalDate.parse(string);
System.out.println(parse.toString());
//结果是2018-12-07 }

三、 时区ZoneID相关操作

ZoneID.of(String zoneId) 时区参数

这里的zoneId字符串可以传入"Asia/Shanghai",字符串如下:

  • EST - -05:00
  • HST - -10:00
  • MST - -07:00
  • ACT - Australia/Darwin
  • AET - Australia/Sydney
  • AGT - America/Argentina/Buenos_Aires
  • ART - Africa/Cairo
  • AST - America/Anchorage
  • BET - America/Sao_Paulo
  • BST - Asia/Dhaka
  • CAT - Africa/Harare
  • CNT - America/St_Johns
  • CST - America/Chicago
  • CTT - Asia/Shanghai
  • EAT - Africa/Addis_Ababa
  • ECT - Europe/Paris
  • IET - America/Indiana/Indianapolis
  • IST - Asia/Kolkata
  • JST - Asia/Tokyo
  • MIT - Pacific/Apia
  • NET - Asia/Yerevan
  • NST - Pacific/Auckland
  • PLT - Asia/Karachi
  • PNT - America/Phoenix
  • PRT - America/Puerto_Rico
  • PST - America/Los_Angeles
  • SST - Pacific/Guadalcanal
  • VST - Asia/Ho_Chi_Minh

将不带时区LocalDateTime转化为带时区的ZonedDateTime

/**
* 把无时区的时间LocaDateTime解析成有时区的ZonedDateTime
*/
@Test
public void localDateTimeToZonedDateTime(){
final String string ="2018-12-07T09:33:38";
LocalDateTime parse = LocalDateTime.parse(string);
ZonedDateTime z1 = ZonedDateTime.of(parse, ZoneId.of("Asia/Shanghai"));
System.out.println(z1.toString());
//2018-12-07T09:33:38+08:00[Asia/Shanghai] ZonedDateTime z2 = ZonedDateTime.of(parse, ZoneId.of("Z"));
System.out.println(z2.toString());
//2018-12-07T09:33:38Z ZonedDateTime z3 = ZonedDateTime.of(parse, ZoneId.of("UTC"));
System.out.println(z3.toString());
//2018-12-07T09:33:38Z[UTC] ZonedDateTime z4 = ZonedDateTime.of(parse, ZoneId.of("UTC+08:00"));
System.out.println(z4.toString());
//2018-12-07T09:33:38+08:00[UTC+08:00] ZonedDateTime z5 = ZonedDateTime.of(parse, ZoneId.of("+08:00"));
System.out.println(z5.toString());
//2018-12-07T09:33:38+08:00 ZonedDateTime z6 = ZonedDateTime.of(parse, ZoneId.of("+00:00"));
System.out.println(z6.toString());
//2018-12-07T09:33:38Z }

由结果可知,String zoneId的字符串值,如果为:

"Asia/Shanghai"例子为"2018-12-07T09:33:38+08:00[Asia/Shanghai]" ;

"Z"和"+00:00"表示的是"2018-12-07T09:33:38Z"这种格式的时间;

"UTC"表示的是"2018-12-07T09:33:38Z[UTC]" ;

"UTC+08:00" 例子:"2018-12-07T09:33:38+08:00[UTC+08:00]" ;

"+08:00" 例子:"2018-12-07T09:33:38+08:00"

部分参考:

https://docs.oracle.com/javase/8/docs/api/java/time/ZoneId.html

http://www.mkyong.com/java8/java-8-convert-date-to-localdate-and-localdatetime/

https://www.cnblogs.com/comeboo/p/5378922.html

给出一个时间段,计算该时间范围由哪些天和月组成

Java8获取当前时间、新的时间日期类如Java8的LocalDate与Date相互转换、ZonedDateTime等常用操作包含多个使用示例、Java8时区ZoneId的使用方法、Java8时间字符串解析成类的更多相关文章

  1. js字符串转日期,js字符串解析成日期,js日期解析, Date.parse小时是8点,Date.parse时间多了8小时

    js字符串转日期,js字符串解析成日期,js日期解析, Date.parse小时是8点,Date.parse时间多了8小时 >>>>>>>>>&g ...

  2. 关于yyyy-MM-dd格式日期字符串,解析成LocalDateTime遇到的问题

    yyyy-MM-dd -> LocalDateTime 直接把yyyy-MM-dd格式的日期字符串解析成LocalDateTime会抛出异常 try { LocalDateTime localD ...

  3. JS中将JSON的字符串解析成JSON数据格式《转》

    在JS中将JSON的字符串解析成JSON数据格式,一般有两种方式: 1.一种为使用eval()函数. 2. 使用Function对象来进行返回解析. 使用eval函数来解析,并且使用jquery的ea ...

  4. JSON字符串解析成JSON数据格式

    在JS中将JSON的字符串解析成JSON数据格式,一般有两种方式: 1.一种为使用eval()函数. 2. 使用Function对象来进行返回解析. 使用eval函数来解析,并且使用jquery的ea ...

  5. js 将XML字符串解析成XML文档 --- attribute construct error--- 空白字符与空格问题

    最近在做xml在线编辑器,遇到一个字符串解析成xml文档的问题,记录一下. 原始xml内容读取自xml文档 <label class="test" id="labe ...

  6. VBScript把json字符串解析成json对象的2个方法

    这篇文章主要介绍了VBScript把json字符串解析成json对象的2个方法,本文通过MSScriptControl.ScriptControl和jscript实现,需要的朋友可以参考下 asp/v ...

  7. xml 字符串解析成通用的map

    [quote]Stax解析技术:快速高效,根据流的形式解析xml,比dom解析技术更加快,dom解析技术是基于文档结构树的,会把整个dom文件树加载到内存进行解析[/quote] package co ...

  8. C#将json字符串解析成对象

    首先我们在客户端生成json字符串,通过ajax把该字符串传到服务器端   //这是一个以id,email,age的json字符串   var jdata="[{\"id\&quo ...

  9. ajax的使用:(ajaxReturn[ajax的返回方法]),(eval返回字符串);分页;第三方类(page.class.php)如何载入;自动加载函数库(functions);session如何防止跳过登录访问(构造函数说明)

    一.ajax例子:ajaxReturn("ok","eval")->thinkphp中ajax的返回值的方法,返回参数为ok,返回类型为eval(字符串) ...

随机推荐

  1. hadoop启动问题分析

    hadoop的安装和启动很简单直接解压进行安装 配置文件就好了,但是启动问题就很多,总结下无非以下两点: 第一点:无论你是群起还是单起;都首要格式化   bin/hdfs namenode -form ...

  2. Robot Operating System (ROS)学习笔记2---使用smartcar进行仿真

    搭建环境:XMWare  Ubuntu14.04  ROS(indigo) 转载自古月居  转载连接:http://www.guyuehome.com/248 一.模型完善 文件夹urdf下,创建ga ...

  3. 通俗理解cookies,sessionStorage,localStorage的区别

    sessionStorage .localStorage 和 cookie 之间的区别共同点:都是保存在浏览器端,且同源的. 区别:cookie数据始终在同源的http请求中携带(即使不需要),即co ...

  4. uva-10954-贪心

    题意:俩个数相加,产生的和就是这次加法的代价,问,所有数都加起来,最小代价是多少 解题思路:贪心,每次都选取最小俩个数相加,如果只有一个数,计算完毕,注意,加法的和要再次入队列. #include & ...

  5. java 获得系统当前时间

    import org.junit.Test; import java.text.SimpleDateFormat; import java.util.Calendar; import java.uti ...

  6. javascript,移动划过超链接鼠标变手型

    用css控制鼠标样式的语法如下:<span style="cursor:*">文本或其它页面元素</span>把 * 换成如下15个效果的一种: 下面是对这 ...

  7. 通过指定的 url 去网络或者文件服务器下载文件到本地某个文件夹

    /** * 从网络Url中下载文件 * @param urlStr 指定的url * @param fileName 下载文件到本地的名字 * @param savePath 本地保存下载文件的路径 ...

  8. CSS属性组-动画、转换、渐变

    一.动画 animation动画属性是一个简写属性,用于设置六个动画属性 aninmation-name动画名称,被调用 animation-duration完成动画需要的持续时间 animation ...

  9. 08-认识margin

    1.margin margin:外边距的意思.表示边框到最近盒子的距离. /*表示四个方向的外边距离为20px*/ margin: 20px; /*表示盒子向下移动了30px*/ margin-top ...

  10. ueditor修改工具栏固定位置和显示空白div

    ueditor.all.js