2011-11-17 35 views
2

所以我和我的合作伙伴一直在這個項目上工作了一段時間。我們在這個項目中使用了很多日期,最近我們注意到了一個問題,在這一點上我們相當深入。Java日期 - 12am存儲爲24?

我們將SQLLite(Android項目)中的時間存儲爲格式化的字符串,因爲很多時候它們都直接綁定到列表視圖等。

我們注意到的問題,我發現有點奇怪,那個SimpleDateTimeFormat對象用於格式化爲24h時間(其基於醫療的項目,所以24h時間就是這裏的約定)12:00 am-12: 59am格式化爲24:00-24:59,而不是00:00-00:59 ...

這不是太多的問題,直到我們查詢數據庫並按日期排序結果,任何在凌晨12點至凌晨12點59分之間的數據將顯示在列表的末尾,但它應該在開頭顯示...

其他人遇到此問題?或瞭解它的方法?最好的辦法是將數據存儲爲00:00而不是24:00。

乾杯

+4

將字符存儲爲字符串就是出錯的地方。 –

回答

5

我強烈懷疑你使用了錯誤的花樣。我們必須猜你有沒有發佈任何代碼(暗示,暗示),但我您使用的模式,如

kk:mm:ss 

,而不是

HH:mm:ss 

樣品懷疑代碼:

import java.util.*; 
import java.text.*; 

public class Test { 
    public static void main(String[] args) throws Exception { 
     SimpleDateFormat broken = new SimpleDateFormat("kk:mm:ss"); 
     broken.setTimeZone(TimeZone.getTimeZone("Etc/UTC")); 
     SimpleDateFormat working = new SimpleDateFormat("HH:mm:ss"); 
     working.setTimeZone(TimeZone.getTimeZone("Etc/UTC")); 

     Date epoch = new Date(0); 

     System.out.println(broken.format(epoch)); 
     System.out.println(working.format(epoch)); 
    } 
} 

此外,正如其他人所指出的那樣,你不應該存儲在字符串格式的值開始......避免字符串轉換的地方就可以了,因爲每個CONV ersion是一個潛在的難題。

+1

yyyy-MM-dd kk:mm是我們的格式,它解釋了這個問題,應該使用HH! – Sidious911

+1

此外,我知道我們應該使用毫秒來存儲它而不是字符串,但正如我所說的,此時該項目非常深入,而且在這一點上做了過多的更改。當我們即將進入測試版時,我們正在尋找一個臨時修復程序,以便我們能夠按時推出,並在下一階段完全修復問題! – Sidious911

1

請閱讀thisthis關於SQLite如何存儲日期(或不存儲日期)。 SQLite沒有「日期」類型,所以它存儲爲一個字符串。您應該將日期存儲爲整數(毫秒),然後您可以使用日期和時間函數將它們從第一個鏈接中提取出來。

從文檔

1.2日期和時間數據類型

SQLite沒有存儲類存儲日期 和/或時間預留。取而代之的是,內置的SQLite 的日期和時間函數能夠存儲日期和時間爲TEXT,REAL或INTEGER 值:

TEXT爲ISO8601字符串(「YYYY-MM-DD HH:MM:SS .SSS「)。 REAL朱利安 天數,天中午起在格林威治十一月 24號,公元前4714根據預測的公曆。 INTEGER 作爲Unix時間,自1970-01-01 00:00:00 UTC以來的秒數。 應用程序可以選擇存儲日期和時間在任何這些 格式和自由使用內置的日期和時間 功能格式之間轉換。

我更喜歡INTEGER/Unix時間存儲,然後使用內置日期和時間函數來格式化從數據庫中提取時間。

編輯:此外,這將照顧排序。我猜你在SQLite日期目前的「排序」是基於字符串,這是不好的mmmmkay。

0

什麼是您傳遞給您的SimpleDateFormat的格式字符串?根據文檔,使用'H'的時間應該讓你0-23,使用'k'應該讓你1-24。