我不得不日期值(TDateTime
)存儲在一個字符串格式。做這個的最好方式是什麼?我考慮了以下方法:以字符串格式存儲日期值的最佳方式是什麼?
FloatToStr
:失去精度,取決於區域設置
`FloatToStr」與格式設置:失去精度
DateTimeToStr
:取決於區域設置
DateTimeToStr
與格式設置:?
有沒有其他的選擇?他們如何在
- 尺寸方面比較記憶的區域設置
- 獨立
- 精密
我不得不日期值(TDateTime
)存儲在一個字符串格式。做這個的最好方式是什麼?我考慮了以下方法:以字符串格式存儲日期值的最佳方式是什麼?
FloatToStr
:失去精度,取決於區域設置
`FloatToStr」與格式設置:失去精度
DateTimeToStr
:取決於區域設置
DateTimeToStr
與格式設置:?
有沒有其他的選擇?他們如何在
使用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使用國際標準並提供相關的額外信息 – 2011-05-19 08:52:55
+1很好的答案。謝謝! – jpfollenius 2011-05-20 14:01:08
多少精做你需要什麼?例如,你可以說從1970年1月1日以來的毫秒數,並將其存儲爲轉換爲字符串的數字。如果空間非常緊張,你可以基於這個價值。缺點是兩者都不會是人類可讀的。
將整數值保存爲一個字符串,而不是浪費空間,並使其更難以讀取機器(因爲它們需要再次將字符串轉換爲適當的整數),這又有什麼意義呢? – 0xC0000022L 2011-05-22 21:58:37
因爲,OP說:「我必須以字符串格式存儲日期值(TDateTime)。」我已經知道你的觀點,因爲這很明顯,但我尊重OP的約束。 – 2011-05-22 22:45:26
只需添加,轉換爲整數就可以消除無效日期值(如「2/30/2011」)的可能性。 – 2011-05-22 22:47:11
一般來說,我會建議在ISO格式的日期時間存儲爲字符串:YYYY-MM-DD HH:NN:ss.mmmm
編輯:如果你想最大限度地減少空間,你可以離開了所有的分離器和格式是這樣的:yyyymmddhhnnssmmmm
你在說什麼「ISO」格式?你提出的佈局是**不兼容ISO-8601。 – 2011-05-19 08:33:35
它與爲ISO 9075-2:2003 – 2011-05-19 09:28:32
中定義的時間戳文字定義的格式相匹配從SQL世界 - 因此它是查詢端,而不是存儲端格式...我認爲BTW yyyymmddhhnnss格式不符合ISO 9075標準。 – 2011-05-19 10:42:51
DateTimeToStr可能會比FloatToStr失去更多的精度。 – Misha 2011-05-19 07:45:18