背景
在之前的故事中,提的最多的是DateTime,看过Joda-Time的会发现还有两个类,LocalDate和LocalTime,使用起来也类似,那么它们之间的区别是什么。作为容易混淆的概念,有必要来澄清一下
核心对象
LocalDate
LocalDate跟DateTime的区别在于两点:
- 没有时区
比如北京程序员写下new LocalDate(),得到的是2018-11-27。如果想转换为伦敦的日期,对不起,转不了。因为LocalDate没有时区。 - 没有时间
说白了只有日期,没有10点:20分:23秒
LocalTime
LocalTime跟DateTime的区别也在于两点:
- 没有时区
比如北京程序员写下new LocalTime(),得到的是11:33:10。如何想转换为伦敦的时间,对不起,也转不了。因为LocalTime没有时区。 - 没有日期
说白了只有时间,没有2018-11-27
DateTime
- 有日期
比如 2018-11-27 - 有时间
比如 11:33:10 - 有时区
比如 北京上海时区
示例
DateTime 转LocalDate场景
//2018-11-27 11:33:10 DateTime默认取系统时区,比如我本机北京上海时区
DateTime beijing10 = new DateTime().withYear(2018).withMonthOfYear(11).withDayOfMonth(27).withTime(11,33,10,0);
//倒退8个小时
DateTime beijing8 = beijing10.plusHours(-8);
//转为伦敦时间
DateTime london = beijing8.withZone(DateTimeZone.UTC);
//输出2018-11-27
LocalDate localDateBeijing = beijing8.toLocalDate();
//输出2018-11-26
LocalDate localDateLondon = beijing8.toLocalDate();
转为LocalDate后,DateTime时区和时间属性就丢掉了。无法得知原先的时区是哪个了。
DateTime 转LocalTime场景
//2018-11-27 11:33:10 DateTime默认取系统时区,比如我本机北京上海时区
DateTime beijing10 = new DateTime().withYear(2018).withMonthOfYear(11).withDayOfMonth(27).withTime(11,33,10,0);
//倒退8个小时
DateTime beijing8 = beijing10.plusHours(-8);
//转为伦敦时间
DateTime london = beijing8.withZone(DateTimeZone.UTC);
LocalTime localTime = london.toLocalTime()
同样时区改变后,再转为LocalTime,得到的就是03:33:10。转换不到原先的北京时间了
LocalDate 与 LocalTime 组装成DateTime
LocalDate nowDate = new LocalDate();
LocalTime nowTime = new LocalTime();
//北京时区
DateTime now = nowDate.toDateTime(nowTime).withZone(DateTimeZone.forOffsetHours(8));
因为LocalDate和LocalTime是没有时区的,你需要知道时区才能还原出之前的时间。
网友评论