2010-07-10 2 views
3

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

CurrentY я могу:

  1. найти от часового пояса
  2. прибудет UTC Offset
  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}

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

Это 1 час по некоторым причинам.

+1

Похожие темы: http://stackoverflow.com/questions/2532729/daylight-saving-time-and-timezone-best-practices – Oded

ответ

2

нормально, я установил его:

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); 
     } 

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

3

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

public static DateTime GetLocalTime(string TimeZoneName) 
{ 
    return TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, TimeZoneInfo.FindSystemTimeZoneById(TimeZoneName)); 
} 
Смежные вопросы