2010-08-23 4 views
3

У меня есть формат даты, что-то подобное:Изменение часовых поясов в C#

Пн, Вс, 22 августа 2010 12:38:33 GMT

Как преобразовать это в EST формате?

Примечание: Я знаю, что это может быть достигнуто с помощью TimeZoneinfo, но это введено в 3.5, я хочу сделать это 2.0 или любую старую версию.

+0

ARE YOU Afte времени часового пояса (7:38:33 EST) или изменить формат даты (08/22/2010)? – ChrisBD

+0

Извините, не возможно без использования 3.5 или разработки собственного, который декодирует текущий часовой пояс, а затем вычитает его. –

+0

Хорошо, re после преобразования времени в соответствии с часовым поясом, например, с 11:00 по Гринвичу до 0600 EST. Еще несколько вопросов: нужно ли просто показывать время пользователю? с учетом корректировок на летнее время и исторических времен, например. 1100 GMT может быть 0700 EST с летним временем, но что, если это было 1100 GMT, когда переход на летнее время не применялся? О, и ему нужно работать с Net 2.0 или 1.1. – ChrisBD

ответ

0

EST, вероятно, не формат, а аббревиатура часового пояса. То есть «ручной» способ состоял бы в том, чтобы проанализировать вышеуказанную дату и вычесть разницу в часовых поясах. Вы должны остерегаться летних периодов времени, то есть вам нужно проверить, соответствует ли вышеуказанное время периоду летнего времени или нет.

3

Думаю, вам нужно идти по старой дороге понимания часовых поясов. Ваш пример довольно простой.

GMT - это UTC с переходниками на летнее время.
EST UTC -5hrs с переходниками на летнее время.

Для того, чтобы получить время в EST, вам нужно вычесть 5 часов.

+0

Фактически GMT - это не UTC с летним временем. Вы обнаружите, что UTC и GMT одинаковы. В настоящее время Великобритания находится на GMT + 1 (британское летнее время). – ChrisBD

+0

@Chris - Pff, это запутывает ... Я основывал то, что я сказал в списке часовых поясов в Windows 7, вы можете увидеть список, указанный здесь, например: http://riotingbits.com/2009/getting-the -current-time-in-a-different-time-zone-c-sharp/- и в этом списке GMT ​​определяется как UTC с переходами на летнее время.Теперь я не знаю, насколько согласованы определения часового пояса в разных средах ... –

+0

Я просто сделал небольшой тест кода с .NET 3.5, преобразовывая DateTime.UtcNow сначала в «Восточное стандартное время», затем в «Стандартное время по умолчанию» », и я получил разницу в 5 часов. Но вы правы, Крис, GMT * обычно * совпадает с UTC - кажется, что Windows (по крайней мере, Win 7) относится к нему по-другому. –

1

Простейший способ, вероятно, состоит в том, чтобы просто взять 5 часов от времени, например.

DateTime dateTime = DateTime.UtcNow; 
dateTime.AddHours(-5); 

Но это не будет учитывать летние сбережения и т. Д. Но вы всегда можете указать для этой возможности.

1

Для Net 2.0 и 1.1 вы можете использовать класс TimeZone, который теперь заменен классом TimeZoneInfo.

Edit после дальнейших исследований Казалось бы, что перед NET 3.5 все, что было доступно был класс TimeZone. Невозможно рассчитать значение TimeDate для часовых поясов, отличных от локального и UTC. Поэтому, если вы хотите рассчитать время как EST или PST, и вы находитесь в Великобритании, все становится немного сложнее.

Вот короткая демонстрационная программа для использования TimeZone (его из основного консольного приложения .:

class Program 
{ 
    static void Main(string[] args) 
    { 
     DateTime time = DateTime.UtcNow; 
     Console.WriteLine(string.Format("UTC time is {0}", time.ToShortTimeString())); 

     TimeZone zone = TimeZone.CurrentTimeZone; 

     //The following line depends on a call to TimeZone.GetUtcOffset for NET 1.0 and 1.1 
     DateTime workingTime = zone.ToLocalTime(time); 
     DisplayTime(workingTime, zone); 
     IFormatProvider culture = new System.Globalization.CultureInfo("en-GB", true); 
     workingTime = DateTime.Parse("22/2/2010 12:15:32"); 

     Console.WriteLine(); 
     Console.WriteLine(string.Format("Historical Date Time is : {0}",workingTime.ToString())); 
     DisplayTime(workingTime, zone); 
     Console.WriteLine("Press any key to close ..."); 
     Console.ReadLine(); 
    } 
    static void DisplayTime(DateTime time, TimeZone zone) 
    { 
     Console.WriteLine(string.Format("Current time zone is {0}", zone.StandardName)); 
     Console.WriteLine(string.Format("Does this time include Daylight saving? - {0}", zone.IsDaylightSavingTime(time) ? "Yes" : "No")); 
     if (zone.IsDaylightSavingTime(time)) 
     { 
      Console.WriteLine(string.Format("So this time locally is {0} {1}", time.ToShortTimeString(), zone.DaylightName)); 
     } 
     else 
     { 
      Console.WriteLine(string.Format("So this time locally is {0} {1}", time.ToShortTimeString(), zone.StandardName)); 
     } 
     Console.WriteLine(string.Format("Time offset from UTC is {0} hours.", zone.GetUtcOffset(time))); 

    } 
} 

Как вы можете видеть, что имеет дело только с местным временем и UTC.

Смежные вопросы