#c# #.net #datetime #timezone
#c# #.net #datetime #Часовой пояс
Вопрос:
Я имею в виду сохранить строгое время UTC в переменной DateTime и вывести его в формате ISO 8601.
Для выполнения последнего я использовал .ToString("yyyy-MM-ddTHH:mm:sszzz")
, и он обнаружил, что часовой пояс равен UTC 01:00.
Я пытался использовать .Kind = DateTimeKind.Utc
, но там говорится, что свойство Kind не имеет установщика.
Как мне явно указать время в UTC? Как устанавливается свойство Kind?
Ответ №1:
Если вы хотите воспользоваться преимуществами часового пояса вашего локального компьютера, вы можете использовать myDateTime.ToUniversalTime()
для получения времени UTC из вашего местного времени или myDateTime.ToLocalTime()
для преобразования времени UTC во время локального компьютера.
// convert UTC time from the database to the machine's time
DateTime databaseUtcTime = new DateTime(2011,6,5,10,15,00);
var localTime = databaseUtcTime.ToLocalTime();
// convert local time to UTC for database save
var databaseUtcTime = localTime.ToUniversalTime();
Если вам нужно преобразовать время из / в другие часовые пояса, вы можете использовать TimeZoneInfo.ConvertTime()
или TimeZoneInfo.ConvertTimeFromUtc()
.
// convert UTC time from the database to japanese time
DateTime databaseUtcTime = new DateTime(2011,6,5,10,15,00);
var japaneseTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time");
var japaneseTime = TimeZoneInfo.ConvertTimeFromUtc(databaseUtcTime, japaneseTimeZone);
// convert japanese time to UTC for database save
var databaseUtcTime = TimeZoneInfo.ConvertTimeToUtc(japaneseTime, japaneseTimeZone);
Ответ №2:
В то время как DateTime.Свойство Kind не имеет установщика, статического метода DateTime.SpecifyKind создает экземпляр DateTime с указанным значением для Kind.
Кроме того, существует несколько перегрузок конструктора DateTime, которые принимают параметр DateTimeKind
Комментарии:
1.
DateTimeKind
Содержит только локальные, неопределенные и UTC. Вероятно, это невозможно, я хочу использовать один конкретный часовой пояс.2. @hardywang Если все, что вам нужно, это указать время и смещение от UTC, тогда вы можете использовать DateTimeOffset . Если вам действительно нужно определить конкретный часовой пояс, то вам нужно объединить DateTime с TimeZoneInfo . Обсуждение см. в разделе Выбор между DateTime, DateTimeOffset и TimeZoneInfo .
3. DateTimeKind на самом деле мало что делает, кроме как действует как точка отсчета при преобразовании времени. На самом деле это ничего не меняет, если вы примените его к существующему DateTime.
Ответ №3:
Вы также можете попробовать это, это легко реализовать
TimeZone time2 = TimeZone.CurrentTimeZone;
DateTime test = time2.ToUniversalTime(DateTime.Now);
var singapore = TimeZoneInfo.FindSystemTimeZoneById("Singapore Standard Time");
var singaporetime = TimeZoneInfo.ConvertTimeFromUtc(test, singapore);
Измените текст на стандартное время, которое вы хотите изменить.
Используйте TimeZone
особенность C # для реализации.
Ответ №4:
Я столкнулся с проблемой часового пояса в системе.DateTime в net framework 4.8. Я полагаю, что в этой версии framework есть ошибка.
Я запускал этот фрагмент кода в net framework 4.8 и net 5.0 ( 3 — это мой местный часовой пояс).
var dateTime = new DateTime(2021, 3, 3, 12, 13, 14);
var dateTimeKindUtc = new DateTime(2021, 3, 3, 12, 13, 14, DateTimeKind.Utc);
var dateTimeSpecifyKind = DateTime.SpecifyKind(dateTime, DateTimeKind.Utc);
var dateTimeToUniversalTime = dateTime.ToUniversalTime();
var timeZoneInfoConvertTimeToUtc = TimeZoneInfo.ConvertTimeToUtc(dateTime);
Console.WriteLine($"{nameof(dateTime)} {dateTime:yyyy-MM-ddTHH:mm:sszzz}");
Console.WriteLine($"{nameof(dateTimeKindUtc)} {dateTimeKindUtc:yyyy-MM-ddTHH:mm:sszzz}");
Console.WriteLine($"{nameof(dateTimeSpecifyKind)} {dateTimeSpecifyKind:yyyy-MM-ddTHH:mm:sszzz}");
Console.WriteLine($"{nameof(dateTimeToUniversalTime)} {dateTimeToUniversalTime:yyyy-MM-ddTHH:mm:sszzz}");
Console.WriteLine($"{nameof(timeZoneInfoConvertTimeToUtc)} {timeZoneInfoConvertTimeToUtc:yyyy-MM-ddTHH:mm:sszzz}");
вывод net framework 4.8
dateTime 2021-03-03T12:13:14 03:00
dateTimeKindUtc 2021-03-03T12:13:14 03:00
dateTimeSpecifyKind 2021-03-03T12:13:14 03:00
dateTimeToUniversalTime 2021-03-03T09:13:14 03:00
timeZoneInfoConvertTimeToUtc 2021-03-03T09:13:14 03:00
вывод net 5.0
dateTime 2021-03-03T12:13:14 03:00
dateTimeKindUtc 2021-03-03T12:13:14 00:00
dateTimeSpecifyKind 2021-03-03T12:13:14 00:00
dateTimeToUniversalTime 2021-03-03T09:13:14 00:00
timeZoneInfoConvertTimeToUtc 2021-03-03T09:13:14 00:00
Комментарии:
1. Из документов : При значениях DateTime спецификатор пользовательского формата «zzz» представляет знаковое смещение часового пояса локальной операционной системы от UTC , измеряемое в часах и минутах. Это не отражает значение DateTime экземпляра. Свойство вида. По этой причине спецификатор формата «zzz» не рекомендуется использовать со значениями DateTime.