Как конвертировать datetime в timestamp с помощью C # /. NET (игнорируя текущий часовой пояс)

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

Я использую приведенный ниже код:

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

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

На данный момент вы вызываете 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; } 

EDIT: Как отмечено в комментариях, Kind DateTime вы проходите, не учитывается при выполнении вычитания. Вы должны действительно передать значение с помощью Kind Utc чтобы это работало. К сожалению, DateTime немного нарушена в этом отношении – см. Мой пост в блоге (рассказ о DateTime ) для более подробной информации.

Возможно, вы захотите использовать мой Node Time / time API, который делает все более ясным, IMO.

Я не совсем уверен, что вы хотите. Вы хотите 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); 

Найти временную метку из 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); } 

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

 value.ToUniversalTime().ToString("O"); 
  • Сокращения временной зоны
  • Как мне заполнить список часовых поясов IANA / Olson от Noda Time?
  • Как перевести между часовыми поясами Windows и IANA?
  • Как использовать пользовательское время в браузере для проверки разницы во времени между клиентом и сервером
  • Получение даты с на несколько часов
  • Как правильно установить JVM TimeZone
  • Как хранить дату и время и временные метки в часовом поясе UTC с JPA и Hibernate
  • Как конвертировать дату с одного часового пояса в другой часовой пояс
  • Как установить часовой пояс MySQL?
  • Названия часовых поясов с одинаковыми свойствами дают разные результаты при применении к метке времени
  • Всегда ли полезно хранить время в UTC или это тот случай, когда лучше хранить в местное время?
  • Давайте будем гением компьютера.