Преобразование даты и времени (местное или utc) в московские и киевские проблемы с часовыми поясами в зависимости от экономии времени DayLight - PullRequest
0 голосов
/ 26 апреля 2018

Есть несколько часовых поясов, которые переключаются на DayLight и не экономят время. Я знаю, что Россия не переключается на это время, и Украина переключается на DayLight, экономя время.

Как я знаю по этой ссылке .NET TimeZoneInfo из часового пояса Олсона Москва использует стандартное российское время, а Киев (Украина) использует стандартное время FLE.

Мой тест:

  1. Зима, Россия, DateTimeKind.Utc

  2. Зима, Россия, DateTimeKind.Local

  3. Лето, Россия, DateTimeKind.Utc

  4. Лето, Россия, DateTimeKind.Local

  5. Зима, Киев, DateTimeKind.Utc

  6. Зима, Киев, DateTimeKind.Local

  7. Лето, Киев, DateTimeKind.Utc

  8. Лето, Киев, DateTimeKind.Local

Время моего ПК (UTC + 00: 00) Лондон + 1 час (сейчас время перехода на летнее время). В своих тестах я использовал время 15:00. Пусть это будет переменная dst = 1 час (для моего локального времени, сэкономленного на DayLight), я хочу понять, почему я получаю этот ответ:

  1. В России UTC + 3, поэтому 15:00 + 3 = 18:00
  2. В России UTC + 3, поэтому 15:00 по местному + 3 = 18:00 (dst * 0, поскольку зима)
  3. В России UTC + 3, поэтому 15:00 + 3 = 18:00
  4. Почему 17:00 ??? (как рассчитывается?)
  5. В Киеве UTC + 2, поэтому 15:00 + 2 = 17:00
  6. В Киеве UTC + 2, поэтому 15:00 по местному + 2 = 17: 00
  7. Почему это 18:00 ??? (как рассчитывается?)
  8. Почему 17:00 ??? (как рассчитывается?)

Windows 7

Часовой пояс: (UTC + 00: 00) Дублин, Эдинбург, Лиссабон, Лондон.

Культура: Великобритания

DateTime time = TimeZoneInfo.ConvertTime(new DateTime(2018, 11, 23, 15, 0, 0, DateTimeKind.Utc),
     TimeZoneInfo.FindSystemTimeZoneById("Russian Standard Time"));
 Console.WriteLine(time);

 time = TimeZoneInfo.ConvertTime(new DateTime(2018, 11, 23, 15, 0, 0, DateTimeKind.Local),
     TimeZoneInfo.FindSystemTimeZoneById("Russian Standard Time"));
 Console.WriteLine(time);

 time = TimeZoneInfo.ConvertTime(new DateTime(2018, 8, 2, 15, 0, 0, DateTimeKind.Utc),
    TimeZoneInfo.FindSystemTimeZoneById("Russian Standard Time"));
 Console.WriteLine(time);

 time = TimeZoneInfo.ConvertTime(new DateTime(2018, 8, 2, 15, 0, 0, DateTimeKind.Local),
     TimeZoneInfo.FindSystemTimeZoneById("Russian Standard Time"));
 Console.WriteLine(time);

 time = TimeZoneInfo.ConvertTime(new DateTime(2018, 11, 23, 15, 0, 0, DateTimeKind.Utc),
     TimeZoneInfo.FindSystemTimeZoneById("FLE Standard Time"));
 Console.WriteLine(time);

 time = TimeZoneInfo.ConvertTime(new DateTime(2018, 11, 23, 15, 0, 0, DateTimeKind.Local),
     TimeZoneInfo.FindSystemTimeZoneById("FLE Standard Time"));
 Console.WriteLine(time);

 time = TimeZoneInfo.ConvertTime(new DateTime(2018, 8, 2, 15, 0, 0, DateTimeKind.Utc),
    TimeZoneInfo.FindSystemTimeZoneById("FLE Standard Time"));
 Console.WriteLine(time);

 time = TimeZoneInfo.ConvertTime(new DateTime(2018, 8, 2, 15, 0, 0, DateTimeKind.Local),
     TimeZoneInfo.FindSystemTimeZoneById("FLE Standard Time"));
 Console.WriteLine(time);

enter image description here

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Как объяснил nvoigt, летнее время Лондона (называемое BST) - UTC + 1. При использовании DateTimeKind.Local значение локально для вашей машины .

Таким образом, чтобы завершить ваш график:

4) Лондон - UTC + 1 (BST), поэтому 15:00 BST = 14:00 UTC. Россия это UTC + 3, поэтому 14:00 + 3 = 17: 00

7) 15:00 UTC. Киев это UTC + 3 (EEST), поэтому 15:00 + 3 = 18: 00

8) Лондон - UTC + 1 (BST), поэтому 15:00 BST = 14:00 UTC. Киев это UTC + 3, поэтому 14:00 + 3 = 17: 00

Все расчеты работают как положено.

0 голосов
/ 26 апреля 2018

Поскольку часовой пояс "Лондон" равен , а не UTC + 0. Это только UTC + 0 зимой, но UTC + 1 летом.

Если вы возьмете свои даты и, прежде чем конвертировать их в «FLE», покажите их в UTC, вы поймете, что я имею в виду.

Пример:

var fleTimeZone = TimeZoneInfo.FindSystemTimeZoneById("FLE Standard Time");
var local = new DateTime(2018, 8, 2, 15, 0, 0, DateTimeKind.Local);
var utc = local.ToUniversalTime();
var fle = TimeZoneInfo.ConvertTime(local, fleTimeZone);

Console.WriteLine(TimeZoneInfo.Local);
Console.WriteLine(TimeZoneInfo.Local + ": " + local);
Console.WriteLine(TimeZoneInfo.Utc + ": " + utc);
Console.WriteLine(fleTimeZone + ": " + fle);

(UTC + 00: 00) Дублин, Эдинбург, Лиссабон, Лондон

(UTC + 00: 00) Дублин, Эдинбург, Лиссабон, Лондон: 02.08.2018 15: 00: 00

UTC: 02.08.2018 14: 00: 00

(UTC + 02: 00) Хельсинки, Киев, Рига, София, Таллинн, Вильно: 02.08.2018 17: 00: 00

...