Как установить часовой пояс (или вид) значения DateTime?
Я имею в виду хранить строгое время UTC в переменной DateTime и выводить его в формате ISO 8601.
Чтобы сделать последнее, я использовал.ToString("гггг-ММ-ддТЧ: мм: ссззз"), и он обнаружил, что часовой пояс UTC+01:00.
Я пытался использовать.Kind = DateTimeKind.Utc, но он говорит, что свойство Kind не имеет установщика.
Как явно указать время в UTC? Как устанавливается свойство Kind?
4 ответа
Хотя свойство DateTime.Kind не имеет установщика, статический метод DateTime.SpecifyKind создает экземпляр DateTime с указанным значением для Kind.
Альтернативно есть несколько перегрузок конструктора DateTime, которые принимают параметр DateTimeKind
Если вы хотите использовать часовой пояс вашего локального компьютера, вы можете использовать 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);
Вы можете попробовать это, это легко реализовать
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# для реализации.
Я столкнулся с проблемой часового пояса в System.DateTime в сетевой структуре 4.8. Полагаю, в этой версии фреймворка есть ошибка.
Я запустил этот фрагмент кода в 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
чистый выход 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