2011-05-19 97 views
12

我不得不日期值(TDateTime)存儲在一個字符串格式。做這個的最好方式是什麼?我考慮了以下方法:以字符串格式存儲日期值的最佳方式是什麼?

FloatToStr:失去精度,取決於區域設置

`FloatToStr」與格式設置:失去精度

DateTimeToStr:取決於區域設置

DateTimeToStr與格式設置:?

有沒有其他的選擇?他們如何在

  • 尺寸方面比較記憶的區域設置
  • 獨立
  • 精密
+0

DateTimeToStr可能會比FloatToStr失去更多的精度。 – Misha 2011-05-19 07:45:18

回答

15

使用ISO-8601格式,如http://en.wikipedia.org/wiki/ISO_8601

詳細介紹如果您需要節省存儲空間,你可以使用「緊湊「的佈局,例如'20090621T054523'。

您可以使用例如FormatDateTime('yyyymmddThhnnss',aDateTime)來生產它。

關於時區和本地化(維基百科):

有在ISO 8601沒有時區指示器時間只表示爲本地時間或相對於UTC。

如果沒有UTC相關信息與時間表示給定的時間被假定爲本地時間。雖然在同一時區進行通信時假定本地時間可能是安全的,但在跨不同時區進行通信時使用時不明確。通常最好使用標準符號表示時區(區域標識符)。

因此,您應該更好地將時間轉換爲UTC,然後在時間戳結尾附加'Z'。或根據當地時區使用+ hh/-hh。 下列時間都指的是同一時刻: 「18:30Z」, 「22:30 + 04」, 「1130-0700」,以及 「15:00-03:30」。

爲了更好的分辨率,則可以通過逗號或點字符之後加入一小部分添加子第二定時:例如表示「14小時30分10秒500毫秒」,表示爲「14:30:10,5」,「143010,5」,「14:30:10.5」或「143010.5」。您可以添加幾個小數來提高分辨率。

如果您需要快速Iso8601轉換例程(使用UTF-8內容),請查看SynCommons.pas中的相應部分。它比默認的SysUtils函數快得多。

PS:

如果你的目的只是爲了TDateTime類型存儲爲一個純粹的Delphi應用程序的文本,您可以使用不是標準但快:採用

function DateTimeToText(const aDateTime: TDateTime): string; 
begin 
    result := IntToStr(PInt64(@aDateTime)^); 
end; 

function TextToDateTime(const aText: string): TDateTime; 
begin 
    PInt64(@result)^ := StrToInt64Def(aText,0); 
end; 

Int64二進制內存結構TDateTime/double的佈局將比任何其他浮點相關的轉換更快。

+1

+1使用國際標準並提供相關的額外信息 – 2011-05-19 08:52:55

+1

+1很好的答案。謝謝! – jpfollenius 2011-05-20 14:01:08

0

多少精做你需要什麼?例如,你可以說從1970年1月1日以來的毫秒數,並將其存儲爲轉換爲字符串的數字。如果空間非常緊張,你可以基於這個價值。缺點是兩者都不會是人類可讀的。

+0

將整數值保存爲一個字符串,而不是浪費空間,並使其更難以讀取機器(因爲它們需要再次將字符串轉換爲適當的整數),這又有什麼意義呢? – 0xC0000022L 2011-05-22 21:58:37

+1

因爲,OP說:「我必須以字符串格式存儲日期值(TDateTime)。」我已經知道你的觀點,因爲這很明顯,但我尊重OP的約束。 – 2011-05-22 22:45:26

+1

只需添加,轉換爲整數就可以消除無效日期值(如「2/30/2011」)的可能性。 – 2011-05-22 22:47:11

6

一般來說,我會建議在ISO格式的日期時間存儲爲字符串:YYYY-MM-DD HH:NN:ss.mmmm

編輯:如果你想最大限度地減少空間,你可以離開了所有的分離器和格式是這樣的:yyyymmddhhnnssmmmm

+1

你在說什麼「ISO」格式?你提出的佈局是**不兼容ISO-8601。 – 2011-05-19 08:33:35

+0

它與爲ISO 9075-2:2003 – 2011-05-19 09:28:32

+0

中定義的時間戳文字定義的格式相匹配從SQL世界 - 因此它是查詢端,而不是存儲端格式...我認爲BTW yyyymmddhhnnss格式不符合ISO 9075標準。 – 2011-05-19 10:42:51

3

的FormatDateTime( 'yyyymmddhhnnss.zzz',現在)

+3

我建議使用yyyymmddhhnnss.zzz作爲格式字符串。這樣,它將獨立於區域設置,最重要的是您可以對它們進行排序。 – HeartWare 2011-05-19 08:26:23

+1

HeartWare是對的,在開始時用* dd/mm存儲*日期不是個好主意。也許更適合在非英語國家展示,但對於計算機POV而言不太合乎邏輯。 – 2011-05-19 08:35:13

+0

編輯以反映上述評論。順便說一句,我總是把時間存儲爲UTC時間。 – Misha 2011-05-19 08:54:39

相關問題