文档章节

Java8新特性之新的日期和时间API

muzi1994
 muzi1994
发布于 2017/02/15 12:40
字数 969
阅读 24
收藏 0
点赞 0
评论 0

使用LocalDate、LocalTime、LocalDateTime

          LocalDate、LocalTime、LocalDateTime 类的实例是不可变的对象,分别表示使用ISO-8601日历系统的日期、时间、日期和时间。它们提供了简单的日期或时间,并不包含当前的时间信息。也不包含与时区相关的信息。

注:ISO-8601日历系统是国际标准化组织制定的现代公民的日期和时间的表示法

	//1.LocalDate、LocalTime、LocalDateTime
	@Test
	public void test1(){
		//获取当前时间
		LocalDateTime ldt = LocalDateTime.now();
		System.out.println(ldt);//2017-03-13T15:52:41.810
		//指定日期实例
		LocalDateTime ldt2 = LocalDateTime.of(2016, 5, 22, 14, 20, 22);
		System.out.println(ldt2);//2016-05-22T14:20:22
		//加一年
		LocalDateTime ldt3 = ldt.plusYears(1L);
		System.out.println(ldt3);//2018-03-13T15:53:51.812
		//分别去年月日时分秒
		System.out.println(ldt.getYear());//2017
		System.out.println(ldt.getMonthValue());//3
		System.out.println(ldt.getDayOfMonth());//13
		System.out.println(ldt.getHour());//15
		System.out.println(ldt.getMinute());//56
		System.out.println(ldt.getSecond());//22
	}

Instant 时间戳

   用于“时间戳”的运算。它是以Unix元年(传统的设定为UTC时区1970年1月1日午夜时分)开始所经历的描述进行运算

	//2.Instant 时间戳
	@Test
	public void test2(){
		Instant in = Instant.now();//默认获取UTC时区时间(格林威治时间),与中国时间差8小时
		System.out.println(in);//2017-03-13T08:04:57.942Z
		OffsetDateTime offsetDateTime = in.atOffset(ZoneOffset.ofHours(8));
		System.out.println(offsetDateTime);//2017-03-13T16:04:57.942+08:00
		//获取时间戳
		System.out.println(in.toEpochMilli());//1489392373689
		//对UTC元年的计算
		Instant newIn = Instant.ofEpochSecond(60);
		System.out.println(newIn);//1970-01-01T00:01:00Z
	}

Duration 和Period

  • Duration:用于计算两个“时间”间隔
  • Period:用于计算两个“日期”间隔
    	//3.Duration 和Period
    	/*Duration:用于计算两个“时间”间隔
    	Period:用于计算两个“日期”间隔*/
    	@Test
    	public void test3() throws InterruptedException {
    		//Duration:用于计算两个“时间”间隔
    		Instant in1 = Instant.now();
    		Thread.sleep(1000);
    		Instant in2 = Instant.now();
    		Duration d = Duration.between(in1, in2);
    		System.out.println(d.toMillis());//1000
    
    		System.out.println("-------------");
    
    		LocalDateTime ldt1 = LocalDateTime.now();
    		Thread.sleep(2000);
    		LocalDateTime ldt2 = LocalDateTime.now();
    		Duration d2 = Duration.between(ldt1, ldt2);
    		System.out.println(d2.toMillis());//2000
    
    		//Period:用于计算两个“日期”间隔
    		LocalDate ld = LocalDate.of(2015, 12, 20);
    		LocalDate ld2 = LocalDate.now();
    		Period p1 = Period.between(ld, ld2);
    		System.out.println(p1.getYears());//1
    		System.out.println(p1.getMonths());//2
    		System.out.println(p1.getDays());//21
    
    	}

 日期的操纵

  • TemporalAdjuster : 时间校正器。有时我们可能需要获取例如:将日期调整到“下个周日”等操作。
  • TemporalAdjusters : 该类通过静态方法提供了大量的常用TemporalAdjuster 的实现
    	//4.TemporalAdjuster : 时间校正器
    	@Test
    	public void test4(){
    		LocalDateTime ldt = LocalDateTime.now();
    		System.out.println(ldt);//2017-03-13T16:36:56.641
    
    		LocalDateTime ldt1 = ldt.withDayOfMonth(10);
    		System.out.println(ldt1);//2017-03-10T16:36:56.641
    
    		LocalDateTime ldt2 = ldt.with(TemporalAdjusters.next(DayOfWeek.SUNDAY));
    		System.out.println(ldt2);//2017-03-19T16:36:56.641
    
    		//自定义下一个周日
    		LocalDateTime ldt4 = ldt.with((l) ->{
    			LocalDateTime ldt3 = (LocalDateTime) l;
    			DayOfWeek dow = ldt3.getDayOfWeek();
    			if (dow.equals(DayOfWeek.SUNDAY)){
    				return ldt3.plusDays(7L);
    			}else if (dow.equals(DayOfWeek.MONDAY)){
    				return ldt3.plusDays(6L);
    			} else if (dow.equals(DayOfWeek.THURSDAY)){
    				return ldt3.plusDays(5L);
    			}else if (dow.equals(DayOfWeek.WEDNESDAY)){
    				return ldt3.plusDays(4L);
    			} else if (dow.equals(DayOfWeek.FRIDAY)){
    				return ldt3.plusDays(3L);
    			}else if(dow.equals(DayOfWeek.SATURDAY)){
    				return ldt3.plusDays(2L);
    			}else{
    				return ldt3.plusDays(1L);
    			}
    		});
    		System.out.println(ldt4);//2017-03-19T16:51:55.069
    	}

解析与格式化

java.time.format.DateTimeFormatter 类:该类提供了三种格式化方法:

  •  预定义的标准格式
  • 语言环境相关的格式
  • 自定义的格式 
	//5.DateTimeFormatter:解析与格式化
	@Test
	public void test5(){
		DateTimeFormatter dtf = DateTimeFormatter.ISO_DATE;
		LocalDateTime ldt = LocalDateTime.now();

		String str = ldt.format(dtf);
		System.out.println(str);//2017-03-13

		System.out.println("-----------------------");
		//自定义自己的格式
		DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy年MM月dd日HH时mm分ss秒");
		String str1 = dtf1.format(ldt);
		System.out.println(str1);//2017年03月13日17时13分26秒

		LocalDateTime ldt2 = LocalDateTime.parse(str1, dtf1);
		System.out.println(ldt2);//2017-03-13T17:13:26
	}

时区的处理

  • Java8 中加入了对时区的支持,带时区的时间为分别为:ZonedDate、ZonedTime、ZonedDateTime

其中每个时区都对应着ID,地区ID都为“{区域}/{城市}”的格式例如:Asia/Shanghai 等
ZoneId:该类中包含了所有的时区信息
getAvailableZoneIds() : 可以获取所有时区时区信息
of(id) : 用指定的时区信息获取ZoneId 对象

	//6.ZonedDate、ZonedTime、ZonedDateTime
	@Test
	public void test6(){
		//获取支持的所有时区
		Set<String> set =  ZoneId.getAvailableZoneIds();
		set.forEach(System.out::println);
	/*	Asia/Aden
		America/Cuiaba
		Etc/GMT+9
		Etc/GMT+8
		Africa/Nairobi
		America/Marigot
		Asia/Aqtau
		Pacific/Kwajalein
		America/El_Salvador
		Asia/Pontianak
		Africa/Cairo
		......
		*/
		LocalDateTime ldt = LocalDateTime.now(ZoneId.of("Asia/Shanghai"));
		System.out.println(ldt);//2017-03-13T17:22:15.483

		LocalDateTime ldt1 = LocalDateTime.now(ZoneId.of("Africa/Monrovia"));
		ZonedDateTime zdt = ldt1.atZone(ZoneId.of("Asia/Shanghai"));
		System.out.println(zdt);//2017-03-13T09:24:15.446+08:00[Asia/Shanghai]
	}

 

© 著作权归作者所有

共有 人打赏支持
muzi1994

muzi1994

粉丝 4
博文 86
码字总数 30965
作品 0
朝阳
Java 8 中新的 Date 和 Time 类入门详解

这篇文章主要是java8中新的Date和Time API的实战。新的Date和Time类是java开发者社区千呼万唤始出来的。Java8 之前存在的Date类一直都受人诟病,很多人都会选择使用第三方的date库joda-time...

默默学习中 ⋅ 2016/05/04 ⋅ 0

【java8】java新特性(一)——全局观

一、前言 年前的时候 ,我一个师姐出去工作,被鄙视了。说写的代码太垃圾。当时我也没有在意,回头想想自己,本以为自己写的代码天衣无缝,无可挑剔。但是自从自己遇到了Java8 后,我的世界观...

kisscatforever ⋅ 03/15 ⋅ 0

Java8 学习笔记

先来一个概览,上图是我整理的Java8中的新特性,总的来看,大致上可以分成这么几个大块。 函数式接口 所谓的函数式接口就是只有一个抽象方法的接口,注意这里说的是抽象方法,因为Java8中加入...

xrzs ⋅ 2013/05/14 ⋅ 0

博为峰Java技术题 ——JavaSE Java 8 新特性

博为峰小博老师: Java 8(又称为jdk1.8)是Java语言开发的一个主要版本 Oracle公司于2014年3月18日发布Java 8它支持函数式编程,新的 JavaScript引擎,新的日期API,新的Stream API等。 [新特性...

博为峰教研组 ⋅ 2016/12/05 ⋅ 0

30分钟入门Java8之默认方法和静态接口方法

30分钟入门Java8之默认方法和静态接口方法 作者:@JohnTsai 本文为作者原创,转载请注明出处:http://www.cnblogs.com/JohnTsai/p/5598036.html 30分钟入门Java8之默认方法和静态接口方法 前...

spinachgit ⋅ 01/12 ⋅ 0

java8新特性介绍

一:接口的默认方法 Java8允许开发者通过使用关键字default向接口中加入非抽象方法。这一特性被称为扩展方法。

yjpfj1203 ⋅ 2016/12/15 ⋅ 0

新款时间日期API已上线

历史 早期,Java 对时间和日期的使用往往重度依赖 java.util.Date和java.util.Calendar。 可惜的是,这2个api 本身不够健壮,有类似线程不安全等诸多问题,于是乎2000年左右,市面上出现了很...

Garrry ⋅ 2016/01/18 ⋅ 0

JAVA8的新特性

很高兴能在此给大家分享Java8的新特性。这篇文章将一步一步带你了解Java8的所有新特性。我将通过简单的实例代码向大家展示接口中默认方法,lambda 表达式,方法引用,重复注解的使用. 看过这篇...

莫问viva ⋅ 2015/12/22 ⋅ 0

Java 8新特性探究(七)深入解析日期和时间-JSR310

博客一个月没更新了,这次给大家讲下java8时间与日期API。 众所周知,日期是商业逻辑计算一个关键的部分,任何企业应用程序都需要处理时间问题。应用程序需要知道当前的时间点和下一个时间点...

成熟的毛毛虫 ⋅ 2014/01/17 ⋅ 20

java8新特性介绍(二)

Java 类库的新特性 Java 8 通过增加大量新类,扩展已有类的功能的方式来改善对并发编程、函数式编程、日期/时间相关操作以及其他更多方面的支持。 4.1 Optional 到目前为止,臭名昭著的空指针...

-wangming- ⋅ 2015/06/12 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JVM堆的理解

在JVM中,我们经常提到的就是堆了,堆确实很重要,其实,除了堆之外,还有几个重要的模块,看下图: 大 多数情况下,我们并不需要关心JVM的底层,但是如果了解它的话,对于我们系统调优是非常...

不羁之后 ⋅ 昨天 ⋅ 0

推荐:并发情况下:Java HashMap 形成死循环的原因

在淘宝内网里看到同事发了贴说了一个CPU被100%的线上故障,并且这个事发生了很多次,原因是在Java语言在并发情况下使用HashMap造成Race Condition,从而导致死循环。这个事情我4、5年前也经历...

码代码的小司机 ⋅ 昨天 ⋅ 1

聊聊spring cloud gateway的RetryGatewayFilter

序 本文主要研究一下spring cloud gateway的RetryGatewayFilter GatewayAutoConfiguration spring-cloud-gateway-core-2.0.0.RC2-sources.jar!/org/springframework/cloud/gateway/config/G......

go4it ⋅ 昨天 ⋅ 0

创建新用户和授予MySQL中的权限教程

导读 MySQL是一个开源数据库管理软件,可帮助用户存储,组织和以后检索数据。 它有多种选项来授予特定用户在表和数据库中的细微的权限 - 本教程将简要介绍一些选项。 如何创建新用户 在MySQL...

问题终结者 ⋅ 昨天 ⋅ 0

android -------- 颜色的半透明效果配置

最近有朋友问我 Android 背景颜色的半透明效果配置,我网上看资料,总结了一下, 开发中也是常常遇到的,所以来写篇博客 常用的颜色值格式有: RGB ARGB RRGGBB AARRGGBB 这4种 透明度 透明度...

切切歆语 ⋅ 昨天 ⋅ 0

CentOS开机启动subversion

建立自启动脚本: vim /etc/init.d/subversion 输入如下内容: #!/bin/bash## subversion startup script for the server## chkconfig: 2345 90 10# description: start the subve......

随风而飘 ⋅ 昨天 ⋅ 0

Nginx + uwsgi @ubuntu

uwsgi 安装 sudo apt-get install python3-pip # 注意 ubuntu python3默认没有安装pippython3 -m pip install uwsgi 代码(test.py) def application(env, start_response): start_res......

袁祾 ⋅ 昨天 ⋅ 0

版本控制工具

CSV , SVN , GIT ,VSS

颖伙虫 ⋅ 昨天 ⋅ 0

【2018.06.19学习笔记】【linux高级知识 13.1-13.3】

13.1 设置更改root密码 13.2 连接mysql 13.3 mysql常用命令

lgsxp ⋅ 昨天 ⋅ 0

LVM

LVM: 硬盘划分分区成物理卷->物理卷组成卷组->卷组划分逻辑分区。 1.磁盘分区: fdisk /dev/sdb 划分几个主分区 输入t更改每个分区类型为8e(LVM) 使用partprobe生成分区的文件:如/dev/sd...

ZHENG-JY ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部