常见类和包的一些整理——java.time.*

Date & Time

日期/时间类型是常见数据类型。处理日期/时间是频繁的操作。

常见对日期/时间类型的数据需要的操作:

  1. 获取日期/时间
  2. 计算两个日期/时间之间的跨度
  3. 加上/减去一些时间
  4. 日期/时间类型与不同格式字符串的转换。

现存类:

java.util.*

1. java.util.Date since JDK 1.0 

能够支持的操作:
    获取当前时间:new Date(); 空构造函数默认获取当前时间
    获取指定时间: new Date(long timestamp);  @deprecated new Date(year, month, day.....)
    比较大小: before / after / compareTo
    字符串转换: Date.parse(String);  toString();//"EEE MMM dd HH:mm:ss zzz yyyy"
其余操作非常GG,因此Date类成为一个从JDK1.0以来,一直被诟(xian)病(qi)到JAVA8的类.

​2. java.util.GregorianCalendar since JDK 1.1
    搞定了set时间(构造函数), 和加上/减去操作这两件事(add(field, amont))。其余继续GG。

3. org.joda.time

Joda-Time became the de facto standard date and time library for Java prior to Java SE 8.

**     Note that from Java SE 8 onwards, users are asked to migrate to java.time (JSR-310) - a core part of the JDK which replaces this project.**(官方吐槽,最为致命) 

java.time.* VS joda-time

same:

Instant - immutable class representint an instantaneous point on the time-line Without zone:
LocalDate - immutable class representding a local date without a time
LocalTime - immutable class representding a time without a date
LocalDateTime - immutable class representding a local date and time
Duration & Period -  amounts of time / date
Without zone:
LocalDate - immutable class representding a local date without a time
LocalTime - immutable class representding a time without a date
LocalDateTime - immutable class representding a local date and time
Duration & Period -  amounts of time / date

diff:

ZonedDateTime VS DateTime: a date-time with a time-zone
ZoneOffSet & ZoneId VS DateTimeZone: time-zone

结论:joda-time与java.time相似,使用上不会有非常大的差别

实际使用:

  • 创建指定时间:

1. 获得当前时间:
   静态方法now():
LocalDateTime time = LocalDateTime.now();

2. 获得指定时间
   静态方法of():
LocalDateTime time = LocalDateTime.of(2018, 1, 1, 0, 0, 0, 0);

   注:
   Local开头的三个类均不对外暴漏构造函数(构造函数为private),通过静态方法of调用构造函数获取实例。
   LocalDateTime持有LocalDate和LocalTime作为成员变量,因此用做示例代码
  • 计算时间跨度:

1. Duration 用于计算毫秒级别的跨度
   
内部持有两个long对象seconds和nanos,用于存储时间跨度
LocalDateTime startTime = LocalDateTime.of(2018, 1, 1, 12, 0, 0);     
LocalDateTime endTime = LocalDateTime.of(2018, 1, 2, 10, 0, 0);     
Duration timeElapsed = Duration.between(startTime, endTime);
System.out.println(timeElapsed.toDays()); // 0

注:调用其toDays等方法,实现逻辑为时间跨度/转化方式,小时的不同会对天数计算造成影响

2.  Period用于计算年、月、日级别的跨度 
    内部持有3个int对象存储不同级别的时间跨度

LocalDate startDate = LocalDate.of(2018, 1, 1);
LocalDate endDate = LocalDate.of(2018, 1, 2);     
Period dateElapsed = Period.between(startDate, endDate);
System.out.println(dateElapsed.getDays());// 1
System.out.println(dateElapsed.getYears());// 1

注:get()方法直接返回该级别的时间跨度,不会进行累加
  • 加上/减去一些时间:

上述类都提供良好的、基于不同级别的加减函数:

LocalDate lastDayOfJan = LocalDate.of(2018, 1, 31);       
LocalDate firstDayOfFeb = lastDayOfJan.plusDays(1);       
LocalDate lastDayOfFeb = lastDayOfJan.plusMonths(1);       
System.out.println(firstDayOfFeb); // 2018-02-01       
System.out.println(lastDayOfFeb); // 2018-02-28
注:开发者无需关注不同级别加减后时间的进位运算。
  • 日期/时间与字符串的转换:

1. str to date:

String pattern = "E yyyy-MM-dd HH:mm";   
private static ZoneId zone = ZoneId.systemDefault();   
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern, Locale.CHINA)          
                            .withLocale(Locale.CHINA).withZone(zone);   
LocalDate localDate = LocalDate.parse(str, formatter);

2. date to str:
    
DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE               
                            .withLocale(Locale.CHINA)               
                            .withZone(zone);     
String dateStr = formatter.format(LocalDate.of(2018, 1, 1));

注:
DateTimeFormatter已经提供了大量的内置日期/时间输出,基本足够日常使用。此外还可以根据需要自定义,详情参考API文档。
对于Local开头的三个类型来说,并没有时期的概念。因此要在formatter设置时区,否则会报错。
  • 新旧类型兼容:与Date类型之间的转换


Date类型提供from(Instant)和toInstant()方法,可以与Instant类相互转换。
java.time.*内的类又可以和Instant相互转换,实现新旧类型完美兼容。
e.g:
LocalDate--LocalDateTime.of()-->LocalDateTime--atZone()-->ZonedDateTime--toInstant()-->Instant

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值