C # конвертировать UTC int в объект DateTime - PullRequest
6 голосов
/ 03 июля 2011

Я не знаю, почему это так сложно!

У меня есть плагин, который проходит через длинный int UTC. Мне нужно преобразовать это число в DateTime для запроса к моей базе данных (SQL Server).

Я не знаю почему, но я не могу найти действенный ответ из обычного поиска Google.

(Для дополнительного кредита мне нужно превратить мои возвращенные DateTime обратно в UTC в конце дня.)

Стыдно задавать такой простой вопрос! :)

Ответы [ 3 ]

22 голосов
/ 03 июля 2011

Полагаю, это будет миллисекунда или секунда с определенной эпохи - вполне возможно, эпоха Unix 1 января 1970 года, полночь UTC.

Так что код будет выглядеть примерно так:

private static readonly DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0,
                                                          DateTimeKind.Utc);

public static DateTime FromMillisecondsSinceUnixEpoch(long milliseconds)
{
    return UnixEpoch.AddMilliseconds(milliseconds);
}

Внесите очевидные изменения в течение нескольких секунд или из другой эпохи:)

Альтернативный подход - создать TimeSpan секунд / миллисекунд с начала эпохи, а затем добавить его вэпоха:

private static readonly DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0,
                                                          DateTimeKind.Utc);

public static DateTime FromMillisecondsSinceUnixEpoch(long milliseconds)
{
    return UnixEpoch + TimeSpan.FromMilliseconds(milliseconds);
}

Я не знаю какой-либо существенной разницы между ними - хотя тот факт, что AddMilliseconds принимает double вместо long, предполагает, что для очень больших значений TimeSpan подход может быть предпочтительным.Я сомневаюсь, что это будет иметь какое-либо значение, хотя:)

9 голосов
/ 03 июля 2011

Инт, у вас есть секунды, миллисекунды или что? После преобразования в тики (один тик .NET равен 100 наносекундам), например long ticks = theDBDateNum*TimeSpan.TicksPerMillisecond;, попробуйте это:

DateTime theDate = new DateTime(ticks, DateTimeKind.Utc);
0 голосов
/ 10 июня 2018

Согласно https://www.epochconverter.com/,

Эпоха Unix (или время Unix, или время POSIX, или метка времени Unix) - это количество секунд, прошедших с 1 января 1970 года (полночь UTC / GMT)без учета високосных секунд.

И позже,

var epoch = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds;

Позже,

private string epoch2string(int epoch) {
return new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(epoch).ToShortDateString(); }
...