2012-07-22 97 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的互操作性。