Как найти часовой пояс и время возврата с примененным DaylightSavingTime? - PullRequest
3 голосов
/ 10 июля 2010

Я пытаюсь найти часовой пояс и время возврата с примененным DaylightSavingTime?

В настоящее время я могу:

  1. найти часовой пояс
  2. получить смещение utc
  3. рассчитать местное время на основе этого
  4. определить, использует ли часовой пояс DaylightSavingTime
  5. получить правила для DaylightSavingTime
  6. определить, использует ли текущее время DaylightSavingTime

Однако у меня возникают проблемы с применением правил, вот код:

FYI

System.DateTime.Now.ToUniversalTime().Add(timeDiffUtcClient) возвращает = 2010/07/10 09:25:45 AM

 DateTime localDate = System.DateTime.Now.ToUniversalTime();
// Get the venue time zone info
TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
TimeSpan timeDiffUtcClient = tz.BaseUtcOffset;
localDate = System.DateTime.Now.ToUniversalTime().Add(timeDiffUtcClient);


if (tz.SupportsDaylightSavingTime && tz.IsDaylightSavingTime(localDate))
{
    localDate = localDate.Subtract(tz.GetAdjustmentRules().Single(r => localDate >= r.DateStart && localDate <= r.DateEnd).DaylightDelta);
}
DateTimeOffset utcDate = localDate.ToUniversalTime();


return localDate;

Окончательное значение localDate из {2010/07/10 08:20:40 AM}

Это должно быть {2010/07/10 09:20:40 AM}

Это почему-то 1 час.

Ответы [ 2 ]

3 голосов
/ 07 декабря 2012

Я прыгаю здесь немного поздно, но я не уверен, почему вы делаете все это вручную. Не может быть заменена вся ваша функция на:

public static DateTime GetLocalTime(string TimeZoneName)
{
  return TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, TimeZoneInfo.FindSystemTimeZoneById(TimeZoneName));
}
3 голосов
/ 10 июля 2010

хорошо, я исправил это:

 public static DateTime GetLocalTime(string TimeZoneName)
    {
        DateTime localDate = System.DateTime.Now.ToUniversalTime();

        // Get the venue time zone info
        TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById(TimeZoneName);
        TimeSpan timeDiffUtcClient = tz.BaseUtcOffset;
        localDate = System.DateTime.Now.ToUniversalTime().Add(timeDiffUtcClient);
        //DateTimeOffset localDate = new DateTimeOffset(venueTime, tz.BaseUtcOffset);

        if (tz.SupportsDaylightSavingTime && tz.IsDaylightSavingTime(localDate))
        {
            TimeZoneInfo.AdjustmentRule[] rules = tz.GetAdjustmentRules();
            foreach (var adjustmentRule in rules)
            {
                if (adjustmentRule.DateStart <= localDate && adjustmentRule.DateEnd >= localDate)
                {
                    localDate = localDate.Add(adjustmentRule.DaylightDelta);
                }
            }
            //localDate = localDate.Subtract(tz.GetAdjustmentRules().Single(r => localDate >= r.DateStart && localDate <= r.DateEnd).DaylightDelta);
        }
        DateTimeOffset utcDate = localDate.ToUniversalTime();


        return localDate;
    }

Чтобы проверить это, вы можете сделать это:

Hashtable list = new Hashtable();
        foreach (TimeZoneInfo tzi in TimeZoneInfo.GetSystemTimeZones())
        {
            string name = tzi.DisplayName;
            DateTime localtime = TimeZoneHelper.GetLocalTime(tzi.Id);
            list.Add(name, localtime);
        }

затем сделайте быстрый просмотр списка «в конце» и перейдите на worldtimeserver.com и подтвердите несколько городов.

...