如何在Play中处理MultiTimeZone和本地时间/日期

时间:2012-07-22 20:25:07

标签: playframework-2.0 jodatime

我对MultiTimeZone和/或当地日期的经验不多,所以我对此不屑一顾,但我不知道如何以及从哪里开始,所以请对我轻轻一点: - )

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

  1. 日期(存储日,月和年)
  2. DateTime(与1相同,但包括时间)
  3. 如何在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时间。如果我有时间,我会在这里发布我的代码。

1 个答案:

答案 0 :(得分:2)

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

较长版本:

多区域设置可能很复杂,并且不仅仅是在用户的时区中显示日期和时间。

您需要考虑的一些事项示例:

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

java.util.Date仅限于表示单个瞬间。这使得很难应对这些场景。你甚至不能通过检查它是否代表日期或日期时间来判断。

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

如果您正在使用JPA,Joda的适配器存在并正常工作。如果你必须在别处使用它,Joda确实提供了与java.util.Date的互操作性。