У меня есть ZonedDateTime
, который я создал, используя DateTimeOffset
и идентификатор часового пояса (строка), и у меня также есть DateTimeZone
.
В конкретном случае у меня есть необходимость изменить Zone
ZonedDateTime без фактического преобразования времени (т.е. у меня 18:00 UTC-4: 00, я хочу изменить это на 18:00 UTC- 8 без с соответствующим преобразованием 18:00)
Единственная подходящая функция, которую я нахожу, это .WithZone(DateTimeZone)
, но, похоже, она конвертирует мое время на основе предоставленной зоны
Как я могу изменить "часовой пояс" моего ZonedDateTime без преобразования времени?
РЕДАКТИРОВАТЬ Я нашел решение, которое, кажется, работает:
private DateTimeOffset myFunction(DateTimeOffset dateTimeOffset, string timeZoneId) {
// get the DateTimeZone (i.e. Etc/GMT)
DateTimeZone timezone = DateTimeZoneProviders.Tzdb[timeZoneId];
// create a new DTO with the previous date/time values, but with the DateTimeZone Offset
var newDTO = new DateTimeOffset(dateTimeOffset.DateTime, timezone.GetUtcOffset(SystemClock.Instance.GetCurrentInstant()).ToTimeSpan());
// create a ZonedDateTime based on the new DTO
var nodaDTO = ZonedDateTime.FromDateTimeOffset(newDTO);
// the correct datetime in the correct zone
var finalProduct = nodaDTO.WithZone(timezone);
return finalProduct.ToDateTimeOffset();
}