2008-11-12 38 views
5

沒有時間或時區組件我需要能夠存儲日期(年/月/日),沒有時間部分。這是一個抽象的日期概念,比如生日 - 我需要在一年中表示一個日期,而不是一個特定的時間。日期在Java/MySQL的

我使用Java來解析從輸入文本的日期,並且需要在一個MySQL數據庫來存儲。無論數據庫,應用程序或任何客戶端在什麼時區,它們都應該看到相同的年/月/日。

我的應用程序將與數據庫服務器不同的系統時區的機器上運行,我沒有控制權無論是。有沒有人有一個優雅的解決方案,以確保我正確存儲日期?

我能想到的這些解決方案,無論是它似乎很不錯的:其時區

  • 查詢我的MySQL連接,並解析輸入日期在時區
  • 過程完全是日期字符串YYYY -MM-DD

回答

2

我的結論是,在我目前的應用程序的最佳方式(直接簡單的使用工具JDBC)直接作爲字符串插入。對於一個更大的Hibernate應用程序,我可能會打擾寫我自己的用戶類型。不能相信有人不盡管一些公開可用的代碼,因爲您指定的服務器和數據庫都在不同的時區已經解決了這個問題...

+0

是的,在你的Java代碼中,爲日期創建你自己的類型,或者只是使用一個字符串。一個java.util.Date對象是一個特定的時刻,並且不能正確地建模你的用例。 – erickson 2008-11-17 20:29:15

+0

我有一個類似的用例:一個獨立於年份的任意日期,用於將我的數據與季節性數據相關聯。我將整個月份和日期存儲爲整數,而不是使用字符串,而且我也不存儲任何年份表示。 – AjahnCharles 2017-07-24 05:00:33

2

你可以歸零所有時間/時區的東西:

public static Date truncateDate(Date date) 
    { 
     GregorianCalendar cal = getGregorianCalendar(); 
     cal.set(Calendar.ZONE_OFFSET, 0); // UTC 
     cal.set(Calendar.DST_OFFSET, 0); // We don't want DST to get in the way. 

     cal.setTime(date); 
     cal.set(Calendar.MILLISECOND, 0); 
     cal.set(Calendar.SECOND, 0); 
     cal.set(Calendar.MINUTE, 0); 
     cal.set(Calendar.HOUR, 0); 
     cal.set(Calendar.AM_PM, Calendar.AM); 

     return cal.getTime(); 
    } 
0

難道你不能只在表中使用MySQL DATE類型,然後在插入語句中使用格式化的字符串嗎?我認爲這樣會避免任何時區調整。

INSERT INTO time_table(dt) VALUES('2008-12-31') 
+0

你好,SQL注入漏洞! – 2009-01-08 15:08:39

0

,在我看來,你有解釋的一個問題。如果您將日期清零,或者將MM-dd-YYYY存儲爲相同的數據,那麼您是要存儲服務器日期還是數據庫日期?如果是服務器上午11點,第二天上午1點,那個日期是「正確的」?當你從現在開始看一年後的日期時,你會記得這些日期依賴於哪些機器時區?

這些考慮可能有點矯枉過正。但是,爲什麼不把日期存儲在GMT(如果你願意,可以將秒數清零)?

0

java.sql.Date正是因爲這個原因而存在,不幸的是它使用起來非常不方便,因爲它只是擴展java.util.Date而且您必須手動將時間部分設置爲零。