Я использую структуру DateTimeWithZone, которую Джон Скит разместил на Создание DateTime в определенном часовом поясе в c # fx 3.5
Это не сработало точно для моей ситуации, посколькупредполагается, что DateTime, переданный в конструктор, является локальным временем, и поэтому преобразует его в Utc, используя указанную TimeZone.
В моем случае мы в основном будем передавать объекты DateTime уже в Utc (поскольку это то, что мысохраняем) поэтому нам нужно выполнять преобразование только в том случае, если источник DateTime.Kind не является Utc.
Поэтому я изменил конструктор на:
public DateTimeWithZone(DateTime dateTime, TimeZoneInfo timeZone, DateTimeKind kind = DateTimeKind.Utc) {
dateTime = DateTime.SpecifyKind(dateTime, kind);
utcDateTime = TimeZoneInfo.ConvertTimeToUtc(dateTime, timeZone);
this.timeZone = timeZone;
}
Здесь у нас есть необязательный параметр Kindзначение по умолчанию Utc.
Однако при выполнении этого кода и передаче Utc DateTime генерируется следующее исключение:
Преобразование не может быть завершено, поскольку в указанном DateTime отсутствует тип Kind.свойство установлено правильно.Например, когда свойство Kind имеет тип DateTimeKind.Local, часовой пояс источника должен быть TimeZoneInfo.Local.
В соответствии с документами (http://msdn.microsoft.com/en-us/library/bb495915.aspx):
ЕслиСвойство Kind параметра dateTime равно DateTimeKind.Utc, а параметр sourceTimeZone равен TimeZoneInfo.Utc, этот метод возвращает dateTime без каких-либо преобразований.
Поскольку и время ввода, и часовой пояс имеют свойство KindUTC, то я не ожидал бы получить это исключение.
Я неправильно понял?