Независимо от того, что установлен локальный часовой пояс пользователя, с помощью C# (.NET 2.0) мне нужно определить время (объект DateTime) в восточном часовом поясе.
Я знаю об этих методах, но, похоже, нет очевидного способа получить объект DateTime для другого часового пояса, чем тот, в котором находится пользователь.
DateTime.Now
DateTime.UtcNow
TimeZone.CurrentTimeZone
Конечно, решение должно учитывать переход на летнее время.





Как насчет
DateTime lclTime = DateTime.Now;
DateTime ept = lclTime.ToUniversalTime().AddHours(
IsEasternDaylightSavingTime(
lclTime.ToUniversalTime())? -5: -4)
или если у вас уже есть местное время в формате UTC, просто
DateTime lclUtc = DateTime.UtcNow;
DateTime ept = lclUtc.AddHours(
IsEasternDaylightSavingTime(lclUtc)? -5: -4)
Используйте статический словарь жестко закодированных значений для дат Spring-forward и fall back для восточного времени на следующие 50 лет. Это всего лишь 300 байт или около того ... а затем проиндексируйте его, чтобы определить, идет ли переход на летнее время на восточном побережье. .. Как уже было сказано, вам все равно, летнее время сейчас в локальной зоне или нет ...
private static bool IsEasternDaylightSavingTime(DateTime utcDateTime)
{
// hard coded method to determine
// whether utc datetime is Eastern Standard time
// or Eastern Daylight Time
}
Что делать, если в вашем регионе не используется летнее время? Тогда IsDaylightSavingTime вернет false.
Летнее время не влияет на UTC; конечно, нам нужно знать летнее время на Востоке, а не местным жителям.
Понял ... Я не знаю, можно ли создать объект часового пояса для другого часового пояса, который установлен на компьютере. И вам нужно было бы создать объект часового пояса от восточного времени, чтобы определить, летнее время там или нет ...
В .NET 3.5 есть TimeZoneInfo, который предоставляет множество функций в этой области; 2.0SP1 имеет DateTimeOffset, но он гораздо более ограничен.
Получение UtcNow и добавление фиксированного смещения является частью работы, но не поддерживает DST.
Итак, в 3.5 я думаю, вы можете сделать что-то вроде
DateTime eastern = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(
DateTime.UtcNow, "Eastern Standard Time");
Но этого просто нет в 2.0; Извините.
Несмотря на то, что он не находился в рамках ограничений OP, он ответил на МОЙ вопрос, поэтому я изменил это :)
Спасибо! Я просто хочу добавить это: ReadOnlyCollection<TimeZoneInfo> tz = TimeZoneInfo.GetSystemTimeZones(); DateTime eastern = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTime.UtcNow, tz[0].Id);
От - http://msdn.microsoft.com/en-us/library/system.timezoneinfo.converttimefromutc.aspx
Это позволяет найти часовой пояс по названию, если США когда-либо перемещаются на 15 градусов к западу или востоку от лондонского меридиана.
DateTime timeUtc = DateTime.UtcNow;
try
{
TimeZoneInfo cstZone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
DateTime cstTime = TimeZoneInfo.ConvertTimeFromUtc(timeUtc, cstZone);
Console.WriteLine("The date and time are {0} {1}.",
cstTime,
cstZone.IsDaylightSavingTime(cstTime) ?
cstZone.DaylightName : cstZone.StandardName);
}
catch (TimeZoneNotFoundException)
{
Console.WriteLine("The registry does not define the Central Standard Time zone.");
}
catch (InvalidTimeZoneException)
{
Console.WriteLine("Registry data on the Central STandard Time zone has been corrupted.");
}
Я сэкономлю ваше время и скажу, что в .net версии 2.0 нет возможности получить объект DateTime для другого часового пояса, отличного от того, в котором работает программное обеспечение (кроме UTC).
Однако это не означает, что это невозможно сделать за пределами .net. Взгляните на здесь в классе TimeZoneInformation. Этот класс обертывает некоторые вещи p / invoke в Win O / S, чтобы получить информацию о часовом поясе от O / S. Я успешно использовал его, когда был новым 2.0, и он работал очень хорошо. Сайт, над которым я работал, должен был иметь возможность отображать каждую дату и время, локальные для пользователя, и должен был поддерживать летнее время, и этот класс оплатил нам счет.
Как уже упоминалось, .NET 2 не содержит информации о часовом поясе. Однако информация хранится в реестре, и довольно просто написать вокруг нее класс-оболочку:
SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones
содержит подключи для всех часовых поясов. Значение поля TZI содержит все свойства перехода и смещения для часового пояса, но все это заполнено двоичным массивом. Наиболее важные биты (смещение и дневной свет) - это int32, хранящиеся в позициях 0 и 8 соответственно:
int bias = BitConverter.ToInt32((byte[])tzKey.GetValue("TZI"), 0);
int daylightBias = BitConverter.ToInt32((byte[])tzKey.GetValue("TZI"), 8);
Вот архив Как получить информацию о часовом поясе (DST) из реестра?
Ссылка на Archive.org: web.archive.org/web/20090807133141/http://burks.brighton.ac. uk /…
Сравнение дат - это сравнение дат. DateTime просто обертывает структуру памяти, которая определена в тиках, и создает методы для доступа к часто используемым частям памяти, например. день или год, или время, или TimeOfDay и т. д.
Кроме того, преобразование возможно только в том случае, если вы знаете оба смещения источника и назначения, и тогда расчет всегда такой, как указано в -1 * (sourceOffset - destOffset).
Часть в скобках представляет разницу часовых поясов.
Пожалуйста, также смотрите
Получите восточное время в C# без преобразования местного времени
См. stackoverflow.com/questions/27415652/…