我想知道在web应用程序中处理时区的最佳实践。举个例子,服务器在UTC时区,user1和user2都在不同的时区。处理约会的正确方法是什么?
-
当user1添加一个新的日期,它是在不同的时区和服务器是在UTC所以我应该转换日期到UTC和存储在数据库?
-
显示日期时,获取UTC格式的日期,然后根据客户端时区转换并显示。这样合适吗?
-
夏令时问题是什么?是影响这个过程吗?
-
我在某个地方读到商店日期在毫秒,这是好主意吗?
-
是否有合适的方法或库来做到这一点,请建议
我的问题是
客户端与GMT +5:30创建一个记录并设置交付日期和时间假设2014年6月30日11:30 PM GMT +5:30
因此,具有GMT -3:00的Transporter可以看到客户端选择的GMT -3:00的确切本地时间。如何实现呢?
1
是的。通常最好的做法是用UTC存储所有的日期时间值。您的业务逻辑应该在UTC中工作。
您可能还希望存储用户或外部数据源输入的值,作为审计跟踪或调试辅助。但是使用UTC作为正式记录。
是服务器的时区应该设置为UTC(或者,如果不可能,使用Reykjavík冰岛)。但在编程时不要依赖于此。在代码中指定所需的时区,而不是依赖默认值。
<标题> 2 h1> 的。转换为本地化时间以进行显示。当然,除非用户更喜欢UTC。将其视为本地化的一部分。当您进行国际化时,您将使用代码中的键值。然后,在显示后,使用键值查找要显示给用户的本地化翻译字符串。
<标题> 3问题。如果由"DST"你指的是夏令时,使用合适的日期时间库将自动处理夏令时的调整。警告:你需要保持你的库使用的时区定义列表是最新的,因为政府经常改变规则。
如果调整DST(或时区)会导致用户混淆或错误信息,那么在这种情况下,您应该显示UTC。
<标题> 4。在大多数情况下,不要存储或使用毫秒。数据库和日期时间库可以在内部这样做,但您不应该这样做。
一些书呆子会建议跟踪毫秒。但是将日期时间作为毫秒来处理就像将文本作为字节数组来处理一样。我们使用具有更高抽象层次的代码库来处理文本的所有复杂性(UTF-8,变音符的Unicode规范化等),并添加有用的方法(搜索,替换等)。date-time也是如此。
此外,使用毫秒会引起混乱,使调试变得困难,因为您不能很容易地理解它们的值。日期时间工作本质上是棘手的并且容易出错。使用毫秒是没有用的。
并不是所有的数据库和其他库都在内部使用毫秒。有些使用整秒、微秒或纳秒。它们也不使用相同的纪元。 <标题> 5 在Java中,我们有两个很好的日期时间库:Joda-Time和Java。时间(Java 8). java。时间包的灵感来自Joda-Time,但被重新设计。它们有相似的概念,但并不完全相同。只要小心使用import
语句,就可以在代码中使用这两种方法。两者各有优缺点。
避免j.u.Date/.Calendar
不要使用Java附带的Java. util. date和. calendar类。它们是出了名的麻烦,在设计和实现上都有缺陷。它们已经被Sun/Oracle和新的java所取代。时间包。
Joda-Time和java。当其他类需要java.util.Date对象时,我们将提供方便的方法来转换java.util.Date对象。
<标题>奖金提示关于文本格式:
- 避免您在问题中使用的字符串格式。它既笨拙又难以解析。
- 了解使用ISO 8601标准定义的各种字符串格式来表示日期时间值。
- 不要在偏移量中去掉前导零,就像你在问题中所做的那样。这将破坏库中的代码,并违反标准要求。总是写
+05:30
, 绝不写+5:30
。即使在写散文时也要养成这种习惯,而不仅仅是在编程代码中。
Joda-Time 2.3示例代码。
实例化日期时间,本地到+05:30偏移量。我随意选择了加尔各答时区。当然,你可以用合适的替换。
DateTimeZone timeZoneKolkata = DateTimeZone.forID( "Asia/Kolkata" );
DateTime dateTimeKolkata = new DateTime( 2014, DateTimeConstants.JUNE, 30, 23, 30, 0, timeZoneKolkata );
将同一时刻调整到另一个时区,偏移量为-03:00。我随意选择了America/Buenos_Aires
DateTimeZone timeZoneBuenos_Aires = DateTimeZone.forID( "America/Buenos_Aires" );
DateTime dateTimeBuenos_Aires = dateTimeKolkata.withZone( timeZoneBuenos_Aires );
转换为UTC
DateTime dateTimeUtc = dateTimeKolkata.withZone( DateTimeZone.UTC );
标题>标题>标题>标题>标题>