Joda-Time:DateTime,DateMidnight和LocalDate用法

mic*_*son 31 java datetime interface jodatime

Joda-Time库包含不同的日期时间

DateTime - JDK Calendar
DateMidnight的不可变替换 - 表示时间强制为午夜的不可变类
LocalDateTime - 表示本地日期和时间的不可变类(无时区)

我想知道你是如何在分层应用程序中使用这些类的.

我看到几乎所有接口都使用LocalDateTime(至少在服务层)的优势,这样我的应用程序就不必管理时区,并且可以安全地假设时间始终为UTC.然后,我的应用程序可以在执行流程的最开始使用DateTime来管理时区.

我也想知道DateMidnight在哪种情况下有用.

leo*_*loy 77

我看到几乎所有接口都使用LocalDateTime(至少在服务层)的优势,这样我的应用程序就不必管理时区,并且可以安全地假设时间始终为UTC.

我不确定我在这里理解你的想法.LocalDateTimeDateTime代表两个完全不同的概念.事实并非如此LocalDateTime具有一些隐含的UTC时区:它实际上没有时区(在内部它可以DateTime用UTC时区表示,但它只是一个实现细节,对使用它的程序员来说无关紧要).

你可以在API文档中 看到,虽然a DateTime是一个" Instant"(世界时间线上的一个点,一个物理概念),但LocalDateTime它并不是这样的东西.该LocalDateTime实际上是一个Partial,(一个"公民"的概念),在不同的类层次结构.类名可能 - 不幸的是 - 让你认为这LocalDateTime是一些特殊化DateTime:嗯,事实并非如此.

A LocalDateTime应该被视为一对{ Date(Y/M/D); Time(hh:mm:ss.msec)},一组数字,对应于时间相关数据的"民用"标准表示.如果给我们一个LocalDateTime,我们不能直接将其转换为a DateTime,我们需要指定一个时区; 并且转换将我们带到另一种实体.(类比:Java中的字符串和字节流:要在它们之间进行转换,您必须指定字符集编码,因为它们在概念上是不同的东西)

什么时候在应用程序中使用其中一个...它有时是有争议的,但是一旦理解了Jodatime概念,通常就足够清楚了.IMO与"层"没有多大关系,或许更多的是使用案例或场景.

一个非平凡的边界线示例:您在Google工作,编写日历.您必须让用户管理(添加,查看,修改)包含日期时间的事件(让我们忽略经常性事件),说" 我在2019年7月3日上午10:00与我的医生有任命 ".什么是在软件层中使用的时间 - 日期实体(对于此用例)?我会说:a LocalDateTime.因为用户并没有真正处理物理时间点,而是处理民用时间:在手腕或家中显示时钟的日期和时间.他甚至没有想到时区(让我们忽略一个在世界各地旅行的用户的特殊情况......)然后,在商业和表示层,一个 LocalDateTime似乎是正确的实体.

但是假设您还必须编写不同的方案:提醒.当Google内部调度程序检测到用户存储的事件从现在开始是N分钟时,它必须向他发送提醒.在这里," 从现在起N分钟 "是一个完全"物理"的时间概念,所以这里的"业务层"将处理一个DateTime.有几种选择,例如:事件作为a存储在DB中LocalDateTime(即,只有时区和日期没有时区 - 一个经常使用UTC时间戳来表示,但这是一个实现细节).在这种情况下(仅在此情况下)我们必须DateTime将其加载为a ,我们使用时区转换它,可能来自用户的配置文件.

  • DateMidnight是一个坏主意,现已弃用 (8认同)
  • DateMidnight怎么样:-) (2认同)