2

我对 MultiTimeZone 和/或本地日期没有太多经验,所以我对此有所了解,但我不知道如何以及从哪里开始,所以请温柔地对待我 :-)

我有两种类型的日期(时间)字段:

  1. 日期(存储日、月和年)
  2. DateTime(与 1 相同,但包括时间)

我应该如何在 Play 中定义我的属性?

 @Formats.DateTime(pattern="MM-dd-yyyy")
 public Date reqCompletionDate;

或者我应该使用 JodaTime(以前从未使用过):

@Type(type="org.joda.time.contrib.hibernate.PersistentDateTime")
public DateTime reqCompletionDate;

如果我去java.util.Date,如何将其转换为本地用户Date format(即 yyyy-MM-dd)?由于格式问题,播放自动绑定会失败,所以我需要为它创建一个自定义活页夹吗?这会影响我所有的Date领域,对吧?

或者您是否建议对所有日期(时间)字段使用 getter 和 setter,以便我可以传递用户Locale以获取正确的时间。在这种情况下, Play 的自动绑定将失败,我仍然需要自定义绑定器DateDateTime

或者我是否过度思考这一切,应该以不同的方式处理这个问题?谢谢你的想法!

UPDATE: 2012-07-23: I think I will follow these steps:

第 1 步:开始播放并使用 UTC 时区进行初始化

第 2 步:根据 UTC 时区使所有日期时间字段格式相同

第 3 步:尽可能晚地转换为用户本地时间

当用户发布包含local date (time)尽快将其转换为 UTC 时间的表单时。如果我有时间,我会在这里发布我的代码。

4

1 回答 1

2

简而言之,使用 JodaTime。java.util.Date 应该被带到一个安静的领域,给最后一根烟,然后开枪。

更长的版本:

正确使用多语言环境可能很复杂,这不仅仅是在用户的时区中显示日期和时间的问题。

您需要考虑的一些事情的例子:

  • 在澳大利亚时区渲染时,您的生日是否提前一天?
  • 如果用户告诉支持人员它发生在星期二,但支持人员的星期二是 + 7 小时,他会在日志中找到它吗?
  • 17 日的促销活动应该从哪个午夜开始?

java.util.Date 仅限于表示单个时间瞬间。这使得应对这些情况变得非常困难。您甚至无法通过检查它来判断它是代表日期还是日期时间。

Joda 为这些单独的概念提供了单独的类型,这使得使用它们变得更加简单。例如,LocalDate 没有时区或时间组件。您的生日是 LocalDate,因此它永远不会改变,DateTimes 表示为不同的类型。还有其他概念的类型,如间隔、持续时间,这使得时间/日期比较更容易。在极少数情况下,您必须支持不使用公历的语言环境,您可以轻松交换年表。

如果您使用的是 JPA,则 Joda 的适配器存在并且可以工作。如果您必须在其他地方使用它,Joda 也确实提供了与 java.util.Date 的互操作性。

于 2012-07-22T23:17:10.697 回答