Каков наилучший способ хранения значений даты в строковом формате? - PullRequest
12 голосов
/ 19 мая 2011

Я должен хранить значения даты (TDateTime) в строковом формате.Каков наилучший способ сделать это?Я рассмотрел следующие подходы:

FloatToStr: теряет точность, зависит от настроек языка

`FloatToStr 'с настройками формата: теряет точность

DateTimeToStr: зависит отНастройки локали

DateTimeToStr с настройками формата:?

Есть ли другие альтернативы?Как они сравниваются с точки зрения

  • Размер в памяти
  • Независимость от настроек языка
  • Точность

Ответы [ 4 ]

15 голосов
/ 19 мая 2011

Используйте формат ISO-8601, как описано в http://en.wikipedia.org/wiki/ISO_8601

Если вам нужно сэкономить место для хранения, вы можете использовать «компактную» компоновку, например, '20090621T054523'.

Вы можете использовать, например, FormatDateTime('yyyymmddThhnnss',aDateTime) чтобы произвести его.

О часовом поясе и локализации (из википедии):

В ISO 8601 нет указателей часовых поясов. Время представляется только как местное время или относительно UTC.

Если информация о соотношении UTC не указана в представлении времени, предполагается, что время указано в местном времени. Хотя при общении в одном и том же часовом поясе можно предположить местное время, оно может быть неоднозначным при использовании в разных часовых поясах. Обычно предпочтительно указывать часовой пояс (обозначение зоны), используя обозначения стандарта.

Так что вам лучше преобразовать время в UTC, а затем добавить 'Z' в конце отметки времени. Или используйте + чч / чч в соответствии с вашим местным часовым поясом. Следующие моменты времени относятся к одному и тому же моменту: «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 будет быстрее, чем любое другое преобразование, связанное с плавающей точкой.

6 голосов
/ 19 мая 2011

Как правило, я бы рекомендовал хранить дату и время в формате ISO в виде строки: гггг-мм-дд чч: nn: сс.мммм

РЕДАКТИРОВАТЬ: если вы хотите минимизировать пространство, вы можете опустить все разделители и отформатировать его следующим образом: yyyymmddhhnnssmmmm

3 голосов
/ 19 мая 2011

FormatDateTime ('yyyymmddhhnnss.zzz', сейчас)

0 голосов
/ 19 мая 2011

Сколько точности вам нужно? Вы можете взять, скажем, количество миллисекунд, скажем, с 01.01.1970, и просто сохранить его как число, преобразованное в строку. Если места действительно мало, вы можете использовать 64 это значение. Недостатком было бы то, что ни один из них не был бы читаемым человеком.

...