`
shinepaopao
  • 浏览: 142978 次
社区版块
存档分类
最新评论

Java 8中时间API初探之一

    博客分类:
  • Java
阅读更多

Java 8目前已经开始进入大众的视线,其中笔者在写本文之前,留意到其中Java 8预览版中将会出现新的关于日期和时间的API(遵守JSR 310规范)。在本系列文章中,将对这些新的API进行举例说明。首先在本文中,将先介绍以下几个:Instant,LocalDate,LocalTime和LocalDateTime。

  1. Instant (java.time.Instant) 

 

可能最容易开始学习java.time包中的内容的就是先来看看Instant这个类。所谓的Instant类代表的是某个时间(有点象java.util.Date),它是精确到纳秒的(而不是象旧版本的Date精确到毫秒)。如果使用纳秒去表示一个时间则原来的使用一位Long类型是不足够的,需要占用更多一点的存储空间,然而实际上其内部是由两个Long字段组成,第一个部分保存的是自标准Java计算时代(就是1970年1月1日开始)到现在的秒数,第二部分保存的是纳秒数(永远不会超过999,999,999)。我们看下一个具体的例子:

  1.  //获得当前时间 
  2.  
  3. //获得当前时间 
  4. Instant instant = Instant.now();
  5. // 以ISO-8601输出 
  6. System.out.println(instant);

在Open JDK 中运行上面的代码,可以有如下格式的输出:2013-06-25T16:22:52.966Z,可以看到,输入了更为精确的日期。下面的例子是更多的关于Instant类的用法,如

  1. //将java.util.Date转换为Instant 
  2. Instant instant = Instant.ofEpochMilli(new Date().getTime()); 
  3. //从字符串类型中创建Instant类型的时间 
  4. instant = Instant.parse("1995-10-23T10:12:35Z"); 

 

注意,在上面的例子中,有一个字符串中创建Instant类型的时间,但Instant代表的是一个时间,并不包括时区的概念,所以必须传入的是符合UTC格式的字符串)。Instant API也提供了一些很有用的方法允许使用Instant和其他包中的类进行一些运算,下面是例子:

  1. instant.plus(Duration.ofHours(5).plusMinutes(4)); 

 

上面表达的含义为,将现在的时间加上5个小时4分钟。

那么这个例子中,使用了多少个java.time.Instant实例呢?答案是两个。Java.time这个包是线程安全的并且和其他大部分类一样是不可变类。Instant也遵守这个规则,因此plus方法产生一个新的实例,如:

  1. Instant instant1 = instant.plus(Duration.ofHours(5).plusMinutes(4)); 
  2. System.out.println("Instant is immutable, so instant==instant returns: " + (instant == instant1)); 

 

 

输出为:

  1. Instant is immutable, so instant==instant returns: false 

 

 

下面是更多关于计算的例子:

  1. // Substract 5 days of an instant 计算5天前 
  2. instant.minus(5, ChronoUnit.DAYS); // Option 1 方法1 
  3. instant.minus(Duration.ofDays(5)); // Option 2  方法2 
  4.  
  5. //计算两个Instant之间的分钟数 
  6. long diffAsMinutes = instant.periodUntil(instant1, ChronoUnit.MINUTES); // 方法1 
  7. long diffAsMinutes = ChronoUnit.MINUTES.between(instant, instant1); // 方法2 

 

Instant是可比较的,这意味着可以对两个Instant进行比较。它提供了isAfter()和isBefore()两个方法进行比较,如下代码所示:

  1. //用compareTo方法比较 
  2. System.out.format("instant1.compareTo(instant)=%d.%n", instant1.compareTo(instant)); 
  3.  
  4. // 使用isAfter()和isBefore() 
  5. System.out.format("instant1.isAfter(instant)=%b, instant1.isBefore(instant)=%b.%n",  
  6.  instant1.isAfter(instant), instant1.isBefore(instant)) 

 

 

输出结果:

  1. instant1.compareTo(instant)=1
  2. instant1.isAfter(instant)=true, instant1.isBefore(instant)=false 

 

 

Localdate和LocalTime

 

LocalDate表示不带时区的日期,比如1-1-2000。LocalTime表示不带时区的时间,比如04:44:50.12,和之前提到的Instant类是从1970年计算偏移量不同,这两个类的输出是人们习惯阅读的日期和时间。有很多种方法去获得LocalTime和LocalDate的实例,如

  1. LocalDate localDate = LocalDate.now(); 
  2. localDate = LocalDate.ofYearDay(200586); // 获得2005年的第86天 (27-Mar-2005) 
  3. localDate = LocalDate.of(2013, Month.AUGUST, 10); //2013年8月10日 
  4. LocalTime localTime = LocalTime.of(2233); //10:33 PM 
  5. localTime = LocalTime.now(); 
  6. localTime = LocalTime.ofSecondOfDay(4503); // 返回一天中的第4503秒 (1:15:30 AM)

 

LocalDate和LocalTime和Instant一样遵守同样的线程规定―― 如它们的实例子都是不可变的。LocalDate和LocalTime和Instant有同样的计算和比较方法(其中有些方法是在java.time.temporal.Temporal接口中定义的,并且上面这些类都实现了这些方法):

  1. LocalDate localDate1 = localDate.plus(5, ChronoUnit.HOURS); 
  2. localDate.isBefore(localDate1); 

 

LocalDateTime

 

最后来看下在简单日期和时间类中最重要的一个:LocalDataTeime。它是LocalDate和LocalTime的组合体,表示的是不带时区的日期及时间。看上去,LocalDateTime和Instant很象,但记得的是“Instant中是不带时区的即时时间点。可能有人说,即时的时间点不就是日期+时间么?看上去是这样的,但还是有所区别,比如LocalDateTime对于用户来说,可能就只是一个简单的日期和时间的概念,考虑如下的例子:两个人都在2013年7月2日11点出生,第一个人是在英国出生,而第二个是在加尼福利亚,如果我们问他们是在什么时候出生的话,则他们看上去都是在同样的时间出生(就是LocalDateTime所表达的),但如果我们根据时间线(如格林威治时间线)去仔细考察,则会发现在出生的人会比在英国出生的人稍微晚几个小时(这就是Instant所表达的概念,并且要将其转换为UTC格式的时间)。除此之外,LocalDateTime的用法和上述介绍的其他类都很相似,如下例子所示:

  1. LocalDateTime localDateTime = LocalDateTime.now(); 
  2.  
  3. //当前时间加上25小时3分钟 
  4.  
  5. LocalDateTime inTheFuture = localDateTime.plusHours(25).plusMinutes(3); 
  6.  
  7. // 同样也可以用在localTime和localDate中 
  8.  
  9. System.out.println(localDateTime.toLocalTime().plusHours(25).plusMinutes(3)); 
  10.  
  11. System.out.println(localDateTime.toLocalDate().plusMonths(2)); 
  12.  
  13. //  也可以使用实现TemportalAmount接口的Duration类和Period类 
  14.  
  15. System.out.println(localDateTime.toLocalTime().plus(Duration.ofHours(25).plusMinutes(3))); 
  16. System.out.println(localDateTime.toLocalDate().plus(Period.ofMonths(2))); 
4
5
分享到:
评论
1 楼 freezingsky 2013-08-30  
看着java版本一个一个的往上翻,压力真大,一个JDK越来越大,涉及内容越发广泛,可是,生产环境上,还停留在5或者6。。。

相关推荐

    Java NIO 网络编程初探

    Java 1.4 版本添加了一个新的IO API,称为NIO(New IO)。NIO拥有所有IO的功能,但是操作方法却完全不一样。NIO支持面向缓冲区的、基于通道的IO操作。能够更加高效的进行IO操作。NIO同样拥有文件读写,网络通信等IO...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    1.4.1 类(Class):Java世界中一类物体 14 1.4.2 方法(Method):物体的功能 15 1.4.3 main()方法:所有Java程序执行的起点 15 .1.5 名词解释 16 1.5.1 JDK和Java平台 16 1.5.2 Java编译器(Java Compiler)...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    1.4.1 类(Class):Java世界中一类物体 14 1.4.2 方法(Method):物体的功能 15 1.4.3 main()方法:所有Java程序执行的起点 15 .1.5 名词解释 16 1.5.1 JDK和Java平台 16 1.5.2 Java编译器(Java Compiler)...

    Netty初探:掌握高性能网络通信框架,提升Java网络编程技能

    Netty是一个高性能、异步的网络通信框架,它解决了JDK自带的NIO API使用复杂的问题,提供了更高的性能和更低的延迟。Netty广泛应用于互联网行业、游戏行业和大数据领域,如阿里的Dubbo和RocketMQ等都使用了Netty作为...

    开源bbs源码java-ReactnativeDemo:本地演示

    java ReactNative 初探 官方网址: 中文官网: 文档教程更新较慢,往往都是旧版本api的使用方法 中文论坛:   在搭建好ReactNative开发环境之后,就可以正式开始使用ReactNative来开发App了。    为何需要React...

    asp.net知识库

    一个时间转换的问题,顺便谈谈搜索技巧 .net中的正则表达式使用高级技巧 (一) C#静态成员和方法的学习小结 C#中结构与类的区别 C#中 const 和 readonly 的区别 利用自定义属性,定义枚举值的详细文本 Web标准和ASP...

    HybridApp移动应用开发初探

    NativeApp(原生App)是用原生语言(Object-C/Java/C#/....)开发,用户需要下载安装的手机应用。优点是可以完全利用系统的API和平台特性,在性能上也是最好的。缺点是由于开发技术不同,如果你要覆盖多个平台,则要...

    Servlet与JSP核心编程第2版

    11.3 限制jsp页面中java代码的量 11.4 jsp表达式的应用 11.5 示例:jsp表达式 11.6 servlet和jsp页面的对比 11.7 编写scriptlet 11.8 scriptlet示例 11.9 使用scriptlet将jsp页面的某些部分条件化 ...

    分布式专题-04分布式协调服务之Zookeeper实践及与原理分析

    目录导航前言数据存储基于Java API初探zookeeper的使用事件机制如何注册事件机制watcher 事件类型什么样的操作会产生什么类型的事件呢?事务的实现原理深入分析Watcher机制的实现原理ClientCnxn 初始化客户端通过 ...

    Google!Android手機應用程式設計入門

    跟隨擁有Android Market單一應用程式下載超過20萬人次經驗的開發者,用最短的時間踏實地學會必要的 Android應用程式開發基礎知識,然後...開始開發吧!  還不熟悉Java程式語言,但也想快速學會Android應用程式開發...

    开源框架 Spring Gossip

    第一个 Struts 程式 在 Struts 中整合 Spring 第一个 JSF 程式 在 JSF 中整合 Spring <br> 其它 Spring 提供了简化且一致的方式,让您在使用一些 API 或服务时更加简单。 远程...

    hkcc-pacman-robot:CC 学生版 Pacman CCN3140 编程项目 香港理工大学-香港社区学院

    hkcc-pacman-robotCC 学生版吃...实现安卓应用 实施服务器 构建机器人抽象动作 API 实现 Java 应用程序 结合 edu.hkcc.pacmanrobot.launcher.Test the Robot Program with Android App, Server 最终 edu.hkcc.pacman

Global site tag (gtag.js) - Google Analytics