Отметка времени как целое UTC - PullRequest
0 голосов
/ 13 марта 2009

HI

У меня есть устаревшая база данных с полем, содержащим целое число, представляющее дату и время в UTC

Из документации: «Временные метки в CDR появляются в универсальном координированном времени (UTC). Это значение остается не зависит от изменения летнего времени "

Пример значения: 1236772829.

Мой вопрос заключается в том, как лучше всего преобразовать его в .NET DateTime (в коде CLR, а не в БД) как в формате UTC, так и в качестве значения местного времени.

Попробовал гуглить, но безуспешно.

Заранее спасибо / Johan

Ответы [ 2 ]

4 голосов
/ 13 марта 2009

Вам нужно знать, что на самом деле означает целое число. Обычно он состоит из:

  • Эпоха / смещение (то есть, что означает 0) - например, «полночь 1 января 1970 года»
  • Шкала, например секунды, миллисекунды, тики.

Если вы можете получить два значения и то, что они означают в терминах UTC, все остальное должно быть легко. Простейшим способом было бы, вероятно, иметь DateTime (или DateTimeOffset) в качестве эпохи, а затем построить TimeSpan из целого числа, например, TimeSpan.FromMilliseconds и т. Д. Сложите их вместе и все готово. РЕДАКТИРОВАТЬ: Использование AddSeconds или AddMilliseconds в соответствии с ответом aakashm является более простым способом сделать этот бит:)

В качестве альтернативы, сделайте арифметику самостоятельно и вызовите конструктор DateTime, который принимает несколько тиков . (Возможно, версия, принимающая DateTimeKind, также была бы лучше, так что вы можете явно указать, что это UTC.)

3 голосов
/ 13 марта 2009

Поиск этой точной фразы дает мне эту страницу Cicso , в которой говорится: «В поле указывается значение time_t, полученное из операционной системы».

time_t - это концепция библиотеки C, которая, строго говоря, не должна быть какой-либо конкретной реализацией, но обычно для систем UNIX-y будет количеством секунд с начала эпохи Unix, 1970 год, 1 января 00:00.

Предполагая, что это правильно, этот код даст вам DateTime из целого числа:

        DateTime epochStart = new DateTime(1970, 1, 1);

        int cdrTimestamp = 1236772829;

        DateTime result = epochStart.AddSeconds(cdrTimestamp);

        // Now result is 2009 March 11 12:00:29

Вы должны проверить правильность полученных результатов, чтобы убедиться, что это правильная интерпретация этих time_t s.

...