2015-03-11 2 views
2

Я смущен «GMT Стандартное время».«GMT Стандартное время» подразумевает BST?

У меня есть данные, которые хранятся только как DATE, но на самом деле 6PM BST.

Я прочитал его и добавлю 18 часов. Затем я пытаюсь конвертировать в UTC. Мое первоначальное понимание заключается в том, что конверсия не учитывала бы дневное время (так как «GMT Standard Time» и UTC оба без дневного времени). Я думал, что мне придется проверять на светлое время на источнике, а затем внести корректировку.

Однако ConvertTime, похоже, знает о дневном времени в источнике и вносит соответствующие изменения.

Это кажется странным для меня - это ожидаемое поведение?

TimeZoneInfo gmtZone = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time"); 
    TimeZoneInfo utcZone = TimeZoneInfo.FindSystemTimeZoneById("UTC"); 
    public static CultureInfo ci = CultureInfo.InvariantCulture; 


      string SomeDT = "27/01/2000"; //First BST day 
      var sourceDT = DateTime.ParseExact(SomeDT, "dd/MM/yyyy", ci).AddHours(18); 
      var utcDT = TimeZoneInfo.ConvertTime(sourceDT, gmtZone, utcZone); 

      // At this point utcDT has already been changed so test below is redundant. 
      // That Suggest "GMT Standard Time" is actually "Daylight Time" i.e.BST 

      if (gmtZone.IsDaylightSavingTime(sourceDT)) 
      { 
       utcDT = utcDT.AddHours(-1); 
      } 
      else 
      { 
       Console.WriteLine("Not BST"); 
      } 
+1

Британцы поп их пива по Гринвичу в зимнее время, BST летом. Windows не сохраняет отдельные имена для часовых поясов, которые отличаются только при соблюдении дневного освещения. Поэтому «GMT Standard Time» действительно соответствует BST, когда вы выбираете солнечный день. Также причина, по которой «UTC» имеет свое имя. –

ответ

4

Проблема в том, что идентификаторы часовых поясов в Windows сбивают с толку. Несмотря на то, что идентификатор является «стандартным временем GMT», часовой пояс, на который ссылается этот идентификатор, составляет действительно «Время Великобритании» ... как «Европа/Лондон» в IANA. Так что да, он будет наблюдать DST.

Если вы хотите подлинный UTC, просто используйте TimeZoneInfo.Utc.

(В качестве альтернативы, используйте Noda Time или что-то подобное вместо этого, и тем более стандартный IANA time zones ...)

+0

То же самое относится к восточному стандартному времени? WIll, которые на самом деле представляют Daylight time (EDT) в течение лета? – ManInMoon

+1

@ ManInMoon: Yup. Из документов для 'TimeZoneInfo.Id':« Значение свойства Id обычно, но не всегда, идентично значению свойства StandardName ». (Это на самом деле означает «... в английском языке», потому что стандартное имя локализовано, но это другой чайник рыбы.) –

+0

Итак, если все мои данные находятся в «Местном» британском времени, и я конвертирую, как указано выше, - я получу правильный UTC БЕЗ ПРОВЕДЕНИЯ ИГРОВОГО ИСПЫТАНИЯ? – ManInMoon

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