2012-07-22 94 views
2

我对MultiTimeZone和/或本地日期没有太多经验,所以我在这方面弄脏了我的手,但我不知道如何以及从何处开始,所以我轻轻:-)如何处理播放中的MultiTimeZone和本地时间/日期

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

  1. 日期(存储天,月,年)
  2. 日期时间(同1,但包括时间)

How我应该在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 :尽可能晚地转换为用户当地时间

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

回答

2

总之,使用JodaTime。考虑到最后一支香烟和射击,应该将java.util.Date带入一个安静的领域。

更长的版本:

多语言环境可能比较复杂获得的权利,它不只是一个用户的时区呈现日期和时间的问题。

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

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

java.util.Date仅限于表示单个时间点。这使得很难应付这种情况。通过检查一个人是否代表一个日期或一个日期时间,你甚至无法判断。

Joda为这些独立的概念提供了不同的类型,这使得它们更加简单。 LocalDate例如没有时区或时间组件。你的生日是一个LocalDate,所以它永远不会改变,DateTimes被表示为一个不同的类型。 Interval,Duration等其他概念也有类型,这使得时间/日期比较变得更容易。在极少数情况下,您必须支持不使用格里历日历的语言环境,您可以轻松地更换年表。

如果您使用的是JPA,适配器适用于Joda存在并且工作。如果您必须在别处使用它,Joda还会提供与java.util.Date的互操作性。