В чем разница между DateTime.ToUniversalTime и TimeZoneInfo.ConvertTimeToUtc

я только начинаю думать о развертывании веб-приложения, которое должно будет что-то делать для пользователей в начале дня, скажем, в 6 утра. Также в конце их дней.

Везде яЯ читал о людях, которые много говорили только о том, чтобы использовать .ToUniversalTime для хранения времени в UTC, но когда я попробовал это (как я подозревал), это нене работает, и это просто переместило время примерно на час (ям в Великобритании, поэтому я подумал, что это связано с некоторым смещением от GMT к UTC, хотя это неЭто не имеет смысла для меня, так как в настоящее время экономия дневного света должна быть отключена).

У меня есть поле в базе данных, в котором хранится часовой пояс пользователя, и поэтому, когда я начал использовать ConvertTimeToUtc и fromUtc, он начал делать то, что ожидал. Хотя я сноваЯ не уверен, должен ли я сам строить какую-то логику для перехода на летнее время, или он должен сделать это для меня.

Мне главным образом интересно, почему все говорили о .ToUniversalTime, поскольку это действительно некажется, не помогает мне, и я не могЯ не понимаю, как он мог знать, сколько нужно компенсировать время, чтобы перевести его на UTC, тогда как второй способ имел смысл.

Может ли кто-нибудь объяснить, как каждый из этих методов может быть полезен?

Ответы на вопрос(3)

Решение Вопроса

ваши вычисления все еще будут работать? Это причина, по которой люди хранят и обрабатывают все DateTimes как UTC - это устраняет любую двусмысленность. Вы бы нене нужно хранить пользователячасовой пояс Любая машина в любом месте может извлечь дату из базы данных и с легкостью преобразовать ее в местное время.

Если ты'сохраняя время в другом часовом поясе, вы должны вывести его, рассчитать смещение к желаемому часовому поясу, в том числе с учетом перехода на летнее время и с учетом международных дат. В твоем случае тытакже хранение дополнительной ненужной информации.

 Jeff Sternal10 нояб. 2009 г., 02:03
И увидеть еще однуs ответы для более подробной информации:stackoverflow.com/questions/1201378/....

является разница между этими двумя.

В .NET 3.5 и ниже,Datetime.ToUniversalTime реализован как:

public DateTime ToUniversalTime() {
    return TimeZone.CurrentTimeZone.ToUniversalTime(this);
}

Потому что он использовалTimeZone класс, он перенес те же проблемы, упомянутые вдокументы MSDN:

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

В .NET 4.0 и выше,Datetime.ToUniversalTime реализован как:

public DateTime ToUniversalTime() { 
    return TimeZoneInfo.ConvertTimeToUtc(this, TimeZoneInfoOptions.NoThrowOnInvalidTime);
} 

Это устраняет проблему не поддержки исторических правил корректировки, а из-заNoThrowOnInvalidTime флаг,это не то же самое как просто зовет.TimeZoneInfo.ConvertimeToUtc

Метод, который он вызывает, являетсявнутренний перегрузкаConvertTimeToUtc это занимаетTimeZoneInfoOptions флаг.общественности версия метода используетTimeZoneInfoOptions.Noneв то время как этот использует.TimeZoneInfoOptions.NoThrowOnInvalidTime

Разницу можно проиллюстрировать следующим образом. С часовым поясом, установленным на тихоокеанское время США:

DateTime dt = new DateTime(2015, 3, 8, 2, 0, 0, DateTimeKind.Local);
DateTime utc = dt.ToUniversalTime();
Console.WriteLine(utc); // "3/8/2015 10:00:00 AM"

Vs:

DateTime dt = new DateTime(2015, 3, 8, 2, 0, 0, DateTimeKind.Local);
DateTime utc = TimeZoneInfo.ConvertTimeToUtc(dt);  // throws exception!
Console.WriteLine(utc);

Поскольку в эту дату в этом часовом поясе время переходит с 1:59:59 до 3:00:00, обеспечивая местное время 2:00:00.т действительный. Правильнее всего сделать исключение (как во втором случае). Однако, так как существующий договорDateTime.ToUniversalTime из более ранних версий фреймворка это не позволяло, фреймворк предпочитает возвращать значение вместо броска.

Значение, которое он выбирает, рассчитывается на основе использованияобычное время смещение, как если бы переход DST не сделалт происходит.

ответ для объяснения тонких различий между реализациямиDateTime.ToUniversalTime а также .TimeZoneInfo.ConvertTimeToUtc

Для всех, у кого есть конкретный вопрос, сформулированный в заголовке:В чем разница между DateTime.ToUniversalTime и TimeZoneInfo.ConvertTimeToUtc?

Ответ:Нет никакой разницы.

Использование JustDecompile для проверки реализацииDateTime.ToUniversalTime в .NET 4.5 мы видим, что он используетTimeZoneInfo.ConvertTimeToUtc непосредственно:

    public DateTime ToUniversalTime()
    {
        return TimeZoneInfo.ConvertTimeToUtc(this, TimeZoneInfoOptions.NoThrowOnInvalidTime);
    }
 cja04 июл. 2015 г., 13:51
Не согласен с документацией Microsoft:msdn.microsoft.com/en-us/library/bb397769(v=vs.110).aspx См второйЗаметка"
 Clint07 июл. 2015 г., 03:11
Спасибо что подметил это. Я'обновил со ссылкой на Мэтта Джонсонаответ, который объясняет различия.

Ваш ответ на вопрос