mic*_*son 31 java datetime interface jodatime
DateTime - JDK Calendar
DateMidnight的不可变替换 - 表示时间强制为午夜的不可变类
LocalDateTime - 表示本地日期和时间的不可变类(无时区)
我想知道你是如何在分层应用程序中使用这些类的.
我看到几乎所有接口都使用LocalDateTime(至少在服务层)的优势,这样我的应用程序就不必管理时区,并且可以安全地假设时间始终为UTC.然后,我的应用程序可以在执行流程的最开始使用DateTime来管理时区.
我也想知道DateMidnight在哪种情况下有用.
leo*_*loy 77
我看到几乎所有接口都使用LocalDateTime(至少在服务层)的优势,这样我的应用程序就不必管理时区,并且可以安全地假设时间始终为UTC.
我不确定我在这里理解你的想法.LocalDateTime
并DateTime
代表两个完全不同的概念.事实并非如此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 ,我们使用时区转换它,可能来自用户的配置文件.