今天小编给大家分享一下Java8中的时区日期时间怎么处理的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
我同时也发现,这三个类没有任何时区相关的信息,但也不能说它们没处理时区,而只能说它们有选择的隐藏了时区的处理。它们内部会使用操作系统当前的时区。
以此同时,Java 在
java.time包中也提供了几个类用于处理需要关注时区的日期时间 API。它们是
java.time.ZonedDateTime和
java.time.ZoneId。前者用于处理需要时区的日期时间,后者用于处理时区。
ZonedDateTime和
LocalDateTime类似,几乎有着相同的 API。从某些方面说,
ZonedLocalTime如果不传递时区信息,那么它会默认使用操作系统的时区,这样,结果其实和
LocalDateTime是类似的。
比如,我们可以使用
ZonedDateTime的
now()方法返回当前时区 ( 操作系统时区 ) 的日期时间,调用
parse()方法可以将一个包含了时区信息的字符串格式的日期时间转化为一个 ZonedDateTime 实例。
Java8Tester.java
import java.time.ZonedDateTime; public class Java8Tester { public static void main(String args[]) { Java8Tester tester = new Java8Tester(); tester.run(); } public void run() { ZonedDateTime now = ZonedDateTime.now(); System.out.println("当前日期时间是:" + now); ZonedDateTime datetime = ZonedDateTime.parse("2012-10-10T21:58:00+08:00"); System.out.println("日期时间是:" + datetime); } }
运行结果如下
当前日期时间是:2018-10-08T22:21:56.806597+08:00[Asia/Shanghai] 日期时间是:2012-10-10T21:58+08:00
我们还可以调用
ZonedDateTime对象的
toLocalDate()和
toLocalTime()方法将获取该实例的转换为本地的日期和时间
import java.time.LocalTime; import java.time.LocalDate; import java.time.ZonedDateTime; public class Java8Tester { public static void main(String args[]) { Java8Tester tester = new Java8Tester(); tester.run(); } public void run() { ZonedDateTime now = ZonedDateTime.now(); System.out.println("当前日期时间是:" + now); LocalDate date = now.toLocalDate(); System.out.println("本地日期是:" + now); LocalTime time = now.toLocalTime(); System.out.println("本地时间是:" + time); } }
运行结果如下
当前日期时间是:2022-10-08T22:28:10.389487+08:00[Asia/Shanghai] 本地日期是:2022-10-08T22:28:10.389487+08:00[Asia/Shanghai] 本地时间是:22:28:10.389487
P.S 这个返回值好诡异,为啥
toLocalDate()还返回了时间?
处理时区
时区相关的信息,我们可以使用
ZoneId类来处理。
比如可以调用
ZoneId类的静态方法
systemDefault()返回当前的时区。
import java.time.ZonedDateTime; import java.time.ZoneId; public class Java8Tester { public static void main(String args[]) { Java8Tester tester = new Java8Tester(); tester.run(); } public void run() { ZoneId currentZone = ZoneId.systemDefault(); System.out.println("当前时区是: " + currentZone); } }
运行结果如下
当前时区是: Asia/Shanghai
我们还可以调用
ZonedDateTime实例的
getZone()方法获取实例所在的时区
import java.time.ZonedDateTime; import java.time.ZoneId; public class Java8Tester { public static void main(String args[]) { Java8Tester tester = new Java8Tester(); tester.run(); } public void run() { ZonedDateTime now = ZonedDateTime.now(); System.out.println("当前时区是: " + now.getZone()); } }
运行结果如下
当前时区是: Asia/Shanghai