Я пытаюсь использовать, DateTimeOffset
чтобы передать определенный момент времени в любом часовом поясе. Я не могу понять, как использовать TimeZoneInfo
летнее время.
var dt = DateTime.UtcNow;
Console.WriteLine(dt.ToLocalTime());
var tz = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
var utcOffset = new DateTimeOffset(dt, TimeSpan.Zero);
Console.WriteLine(utcOffset.ToOffset(tz.BaseUtcOffset));
Это распечатывает:
02.06.2010 16:37:19 02.06.2010 15:37:19 -06: 00
Я нахожусь в центральном часовом поясе, а сейчас мы переходим на летнее время. Я пытаюсь прочитать вторую строку:
02.06.2010 16:37:19 -05: 00
BaseUtcOffset
очевидно, не меняется в зависимости от летнего времени.
Как я могу получить правильное время с правильным значением смещения?
c#
datetimeoffset
timezone
Jaminto
источник
источник
dt.Kind
он установлен правильно.Ответы:
Вам нужно получить UtcOffset из TimeZoneInfo, а затем передать его методу ToOffset ():
var dt = DateTime.UtcNow; Console.WriteLine(dt.ToLocalTime()); var tz = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time"); var utcOffset = new DateTimeOffset(dt, TimeSpan.Zero); Console.WriteLine(utcOffset.ToOffset(tz.GetUtcOffset(utcOffset)));
источник
DateTimeOffset
.Вы также можете использовать TimeZoneInfo.ConvertTimeFromUtc, который позволит перейти на летнее время:
DateTime utc = DateTime.UtcNow; TimeZoneInfo zone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time"); DateTime localDateTime = TimeZoneInfo.ConvertTimeFromUtc(utc, zone);
источник
Или лучше, если вы не хотите жестко кодировать идентификатор часового пояса :
источник
TimeZoneInfo.Local
напрямую? Зачем вам звонокFindSystemTimeZoneById
?DateTime localDateTime = TimeZoneInfo.ConvertTimeFromUtc(networkDateTime, TimeZoneInfo.Local);
Я новичок в .NET и stackoverflow, поэтому могу ошибаться, но вот что:
Использование TimeZoneInfo.ConvertTimeFromUtc позволит перейти на летнее время и преобразовать в правильное время в соответствии с часовым поясом + возможное смещение летнего времени. Однако само смещение в результирующем объекте будет показывать смещение для стандартного времени без учета перехода на летнее время. Поэтому, если вы хотите выполнить ToString для объекта, вы получите правильное время (в часах и минутах), но неправильное смещение во время перехода на летнее время, что может привести к неправильному моменту времени позже в коде.
Если вместо этого вы используете GetUtcOffset для получения смещения за определенное время, а затем выполните ToOffset для объекта DateTimeOffset, часы / минуты и само смещение будут правильно преобразованы, и вы можете безопасно выполнить ToString.
string ExpectedDateTimePattern = "yyyy'-'MM'-'dd'T'HH':'mm':'ss''zzz"; string timeZoneId = "FLE Standard Time"; string dateTimestr = "2017-10-09T09:00:00+02:00"; DateTimeOffset dto = DateTimeOffset.Parse(dateTimeStr); TimeZoneInfo zone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId); TimeSpan offset = zone.GetUtcOffset(dto); dto = dto.ToOffset(offset); string localTime = dto.ToString(ExpectedDateTimePattern);
localTime вернет «2017-10-09T10: 00: 00 + 03: 00».
datetimeoffset timezoneinfo getutcoffset
источник