Изменить часовой пояс в C # - PullRequest
3 голосов
/ 23 августа 2010

У меня есть формат даты, похожий на:

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

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

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

Ответы [ 4 ]

3 голосов
/ 23 августа 2010

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

GMT - это UTC с изменениями летнего времени.
EST - это UTC-5 часов с изменениями летнего времени.1009 * Так что вам просто нужно вычесть 5 часов, чтобы получить время в EST.

1 голос
/ 23 августа 2010

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

Редактировать после дальнейшего исследования Может показаться, чтодо 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.

1 голос
/ 23 августа 2010

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

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

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

0 голосов
/ 23 августа 2010

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

...