2014-04-01 157 views
1

我將日期/時間存儲在Sqlite表中作爲Long值,因此它們最終看起來像138329292113.類似的問題,雖然簡單要存儲,是難以分類。我正在研究一個過濾器函數,該函數綁定到一個高圖形圖表,允許用戶將圖表過濾到特定的日期範圍,因此需要能夠按照日期,月份等從表格中過濾和彙總結果。最簡單的方法來獲取與JodaTime每年的每個月的第一天和最後一天

的唯一途徑到目前爲止,我認爲要做到這一點,是與以下幾行代碼,這將需要重複每月:

LocalDate ld2 = new LocalDate(); 
long januaryStart = ld2.monthOfYear().withMinimumValue().dayOfMonth().withMinimumValue().toDateTimeAtStartOfDay().getMillis(); 
long januaryEnd = ld2.monthOfYear().withMinimumValue().dayOfMonth().withMaximumValue().toDateTimeAtMidnight().getMillis(); 

然後,我會簡單地添加了一個月到1月份去獲得2月份等。使用這個,我應該能夠在月初和月底獲得毫秒數,並將其傳遞給SQL語句,以返回基於此範圍的總和。我一直在想,如果每個月(或其他時間間隔)都有一個更簡單的方法來做到這一點,但到目前爲止,這是我能想到的。

有沒有更簡單的方法來做到這一點,我失蹤了?

在此先感謝!

+0

'DateTime'有'.withDayOfYear()' – fge

回答

2

我想你試過有點過分:

LocalDate date = new LocalDate(); // note: current date in system time zone 
date = date.withMonthOfYear(1); // set to January 

while (date.getMonthOfYear() < 12) { 
    long monthStart = date.dayOfMonth().withMinimumValue().toDateTimeAtStartOfDay().getMillis(); 
    long monthEnd = date.dayOfMonth().withMaximumValue().toDateTimeAtStartOfDay().getMillis(); 
    // store your longs in db 
    date = date.plusMonths(1); 
} 

個人而言,我希望你能考慮你的決定,以存儲結果爲絕對長期米利斯。這種方法使得難以將存儲的時間戳更改回普通日期。有時候不會有可逆的1:1映射。 ANSI-SQL具有不帶時間或時區的DATE的列類型定義。在JDBC中,您可以使用類java.sql.Date。一般來說,您應該選擇最適合您的域用例的數據類型。 millis中類似UNIX的時間戳不應被視爲通用解決方案。所以如果你決定選擇一個簡單的日期,那麼你的代碼可以進一步簡化!然後在一天開始時不需要轉換爲DateTime(即使是與時區相關的)。

+0

謝謝!當我將數據發送到Parse.com後端數據庫時,我與Millis一起去了,這似乎記錄了不同的日期,所以在應用程序和後端之間與Millis一起工作似乎是最簡單的,而不是試圖在兩者之間進行轉置。 –

相關問題