Java中日期时间DateTime和TimeZones编程


在Java 8之前的版本中,我们有Date和Calendar API来处理日期和时间。为了克服旧版Java util Date和Java util Calendar的缺点,Java 8引入了针对Date和Time的新API 。
现有的较旧的Java Date和Calender的一些问题在下面提到。

  • 线程安全:较旧的Date和Calendar类不是线程安全的。因此,开发人员必须处理并发问题。但是Java 8中引入的新的Date和Time API是不可变的,并且是线程安全的。
  • API设计和易于理解:较旧的Date和Calendar API设计不良。新的日期/时间API以ISO为中心,并且遵循一致的日期,时间,持续时间和期间模型。
  • ZonedDate和Time:在旧版本中,我们必须编写其他逻辑来处理不同时区中的时间。但是在新版本中,可以通过Local和ZonedDate / Time API处理时区差异。

 
LocalDate,LocalTime和LocalDateTime
当在我们的开发环境中不需要提及时区时,我们将使用这些类。顾名思义,它表示观察者上下文中的日期和时间。
  • 本地日期

LocalDate以ISO格式表示,没有时间(YYYY-MM-dd)。
LocalDate localDate = LocalDate.now();

  • 当地时间

LocalTime表示不带日期的时间。我们还可以使用parse和of方法或使用系统时钟(现在)来生成LocalTime。
LocalTime localTime = LocalTime.now();

  • LocalDateTime

LocalDateTime用于表示日期和时间的组合。当需要日期和时间的组合时,最常用的类开发人员会选择它们。可以使用parse和of方法,也可以将系统时钟与LocalDateTime一起使用以生成它的实例:LocalDateTime.now()
 
ZonedDateTime API
如果我们需要处理不同的时区要求,则Java 8提供了一个名为ZonedDateTime的类。该了zoneid是用于表示不同的区域的识别符。大约有40个不同的时区,并使用ZoneId表示它们。
首先,我们可以通过将有效时区传递(ZoneId.of("Europe/Paris"))到其构造函数中来创建ZoneId。之后,我们可以将该ZoneId与先前创建的LocalDateTime一起用于创建ZonedDateTime,以准确跟踪时区详细信息。
除此之外,我们可以将LocaDateTime和OffsetDateTime一起用于时区。
OffsetDateTime类跟踪UTC /格林威治标准时间的偏移量,其日期和时间字段以纳秒的精度存储。
  • 首先,通过将参数传递给“ of”方法来创建LocalDateTime的实例:
    LocalDateTime localDateTime = LocalDateTime.of(2015, Month.FEBRUARY.20, 06,30);
  • 然后通过指定距UTC /格林威治标准时间的偏移量来创建ZoneOffset:
    ZoneOffset offset = ZoneOffset.of("+02:00")
  • 之后,您可以将该LocalDateTime与ZoneOffset一起用于创建OffsetDateTime实例。OffsetDateTime代表日期时间,其偏移量为2015–02–20 06:30 +02:00
    offsetDatetime offSetByTwo = offsetDatetime.of(localDateTime , offset );

 
Java的夏时制时间
夏令时(DST)是在夏季的几个月中将时钟向前移动,而在冬季的月份中将时钟向后移动,以利用额外的一小时自然光(节省加热功率,照明功率,增强心情)。在处理日期和时间时,我们需要考虑这种情况。随着一些国家采用这种技术。我们将看到新的Java Date / Time API如何根据不同的位置处理DST。
LocalDateTime localDateTime = LocalDateTime.of(2018, 3,25,1,55);
ZoneId italianZoneId = ZoneId.of("Europe/Paris")
ZoneDateTime zdt = localDateTime.atZone(italianZoneId );

 
Joda-Time库
Joda-Time库是Java 8 Date and Time库的另一种选择。该库提供与Java 8 Date / Time项目类似的功能。通过在我们的项目中包含以下pom依赖项,可以在Maven Central中找到该工件。
<dependency>     
   <groupId>joda-time</groupId>     
   <artifactId>joda-time</artifactId>     
   <version>2.9.4</version> 
</dependency>

更多资源: