美文网首页时间相关操作Joda time
Joda-Time LocalDate、LocalTime、Da

Joda-Time LocalDate、LocalTime、Da

作者: ba2cb747365a | 来源:发表于2018-11-27 11:42 被阅读119次

背景

在之前的故事中,提的最多的是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是没有时区的,你需要知道时区才能还原出之前的时间。

相关文章

网友评论

    本文标题:Joda-Time LocalDate、LocalTime、Da

    本文链接:https://www.haomeiwen.com/subject/rmawqqtx.html