Конвертировать DateTime в Utc, только если еще не Utc - PullRequest
10 голосов
/ 27 мая 2011

Я использую структуру 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, то я не ожидал бы получить это исключение.

Я неправильно понял?

1 Ответ

12 голосов
/ 27 мая 2011

Как говорят документы MSDN, если вы передадите DateTime с типом, установленным в любое значение, кроме DateTimeKind.Utc, и укажите TimeZone, отличный от Utc, функция преобразования выдаст исключение. Это должно быть то, что здесь происходит. В своем коде вы должны проверить, что DateTime уже в Utc, и пропустить преобразование, если оно есть.

Кроме того, поскольку к дате, который вы передаете, будет прикреплено значение DateTime, которое вам, вероятно, не нужно передавать в отдельном параметре Kind.

из документов

Преобразует время в указанное время зона согласованного всемирного времени (UTC).

означает, что он конвертируется из часового пояса, переданного в Utc

функция выдает исключение аргумента, если:

dateTime .Kind - DateTimeKind.Utc и sourceTimeZone не равно TimeZoneInfo.Utc.

-или-

dateTime .Kind is DateTimeKind.Local и sourceTimeZone не равно TimeZoneInfo.Local.

-или-

sourceTimeZone .IsInvalidDateTime ( dateTime) возвращает true.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...