Как преобразовать дату и время в метку времени, используя C # /. NET (игнорируя текущий часовой пояс) - PullRequest
23 голосов
/ 22 марта 2012

Как преобразовать дату и время в метку времени, используя C # .NET (игнорируя текущий часовой пояс)?

Я использую следующий код:

private long ConvertToTimestamp(DateTime value)
{
    long epoch = (value.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
    return epoch;
}

Но он возвращает значение метки времени в соответствии с текущим часовым поясом, и мне нужен результат без использования текущего часового пояса.

Ответы [ 4 ]

52 голосов
/ 22 марта 2012

В данный момент вы звоните ToUniversalTime() - просто избавьтесь от этого:

private long ConvertToTimestamp(DateTime value)
{
    long epoch = (value.Ticks - 621355968000000000) / 10000000;
    return epoch;
}

В качестве альтернативы, и более читабельно ИМО:

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

private static long ConvertToTimestamp(DateTime value)
{
    TimeSpan elapsedTime = value - Epoch;
    return (long) elapsedTime.TotalSeconds;
}

РЕДАКТИРОВАТЬ: Как отмечено в комментариях, Kind из DateTime, который вы передаете, не учитывается при выполнении вычитания. Вы должны действительно передать значение с Kind из Utc, чтобы это работало. К сожалению, DateTime немного сломан в этом отношении - см. мой пост в блоге (разглагольствование о DateTime) для более подробной информации.

Возможно, вы захотите использовать мой Noda Time API даты / времени вместо этого, что делает все более понятным, ИМО.

6 голосов
/ 22 марта 2012

Я не совсем уверен, чего вы хотите.Вы хотите TimeStamp?Тогда вы можете сделать что-то простое, например:

TimeStamp ts = TimeStamp.FromTicks(value.ToUniversalTime().Ticks);

Поскольку вы назвали эпоху переменной, хотите ли вы, чтобы Unix-время эквивалентно вашей дате?

DateTime unixStart = DateTime.SpecifyKind(new DateTime(1970, 1, 1), DateTimeKind.Utc);
long epoch = (long)Math.Floor((value.ToUniversalTime() - unixStart).TotalSeconds);
1 голос
/ 21 ноября 2013

Найти метку времени из DateTime:

private long ConvertToTimestamp(DateTime value)
{
    TimeZoneInfo NYTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
    DateTime NyTime = TimeZoneInfo.ConvertTime(value, NYTimeZone);
    TimeZone localZone = TimeZone.CurrentTimeZone;
    System.Globalization.DaylightTime dst = localZone.GetDaylightChanges(NyTime.Year);
    NyTime = NyTime.AddHours(-1);
    DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, 0).ToLocalTime();
    TimeSpan span = (NyTime - epoch);
    return (long)Convert.ToDouble(span.TotalSeconds);
}
0 голосов
/ 22 марта 2012

У JonSkeet есть хороший ответ, но в качестве альтернативы, если вы хотите сохранить результат более переносимым, вы можете преобразовать дату в формат ISO 8601 , который затем можно будет прочитать в большинстве других сред, но это может упасть вне ваших требований.

value.ToUniversalTime().ToString("O");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...