Подтвердить что ты не робот

Каков наилучший способ хранения значений даты в строковом формате?

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

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

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

DateTimeToStr: зависит от настроек локали

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

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

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

Ответ 1

Используйте формат 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 будет быстрее, чем любое другое преобразование с плавающей запятой.

Ответ 2

В общем, я бы рекомендовал хранить данные в формате ISO в виде строки: yyyy-mm-dd hh: nn: ss.mmmm

EDIT: если вы хотите минимизировать пространство, вы можете оставить все разделители и отформатировать его так: yyyymmddhhnnssmmmm

Ответ 3

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

Ответ 4

Насколько вам нужна точность? Вы можете взять, скажем, количество миллисекунд, так как, скажем, 1/1/1970, и просто сохраните это как число, преобразованное в строку. Если пространство действительно жесткое, вы можете base64 это значение. Недостатком было бы то, что ни один из них не был бы читаемым человеком.