Почему в javascript, создание даты между 1 октября 1941 года и 14 октября 1945 года, добавление GMT ​​+ 0630 в качестве часового пояса - PullRequest
0 голосов
/ 11 сентября 2018

Мой часовой пояс (UTC + 05:30) Ченнаи, Калькутта, Мумбаи, Нью-Дели.

Например:

var date1 = new Date(1944,04,22,0,0,0);
console.log("date1: " + date1);

// output : 
// date1: Mon May 22 1944 00:00:00 GMT+0630 (India Standard Time)

var date2 = new Date(1992,11,28,0,0,0);
console.log("date2: " + date2);

// output : 
// date2: Mon Dec 28 1992 00:00:00 GMT+0530 (India Standard Time)

date1 добавляет GMT + 0630 в конце. Но если я возьму дату после 1945 года, тогда все будет хорошо, т. Е. Она добавит GMT + 0530.

Почему в часовой пояс добавляется один дополнительный час для дат с 1 октября 1941 года по 14 октября 1945 года.

Когда я конвертирую дату1 в C # с помощью:

Convert.ToDateTime("1944-05-21T17:30:00.000Z").ToString("dd/MM/yyyy");

Это дает мне 21.05.1944 вместо 22.05.1944.

Как я могу получить правильную дату и время в C #?

1 Ответ

0 голосов
/ 11 сентября 2018

Несколько вещей:

  • Действительно, Индия действительно использовала UTC + 6: 30 в течение нескольких периодов в 1940-х годах.Эта информация записана в базе данных часовых поясов IANA .Вы также можете сослаться на подробности времени в Индии здесь .

  • .NET (при работе в Windows) не использует базу данных часовых поясов IANA, а скореебаза данных часовых поясов Microsoft Windows.О некоторых различиях между этими двумя наборами данных можно прочитать в теге часового пояса вики .

  • База данных часовых поясов Windows, как правило, не имеет долгосрочной историибольшинства часовых поясов.Для India Standard Time он не имеет никакой истории - при условии, что UTC + 5: 30 всегда действовал.Если ваше приложение должно знать информацию о хронологических часовых поясах, у вас есть два варианта:

    1. Если вы используете .NET Core, вы можете работать в ОС, отличной от Windows (Linux,MacOS и т. Д.), Которая использует полную базу данных часовых поясов IANA.Стандартные API TimeZoneInfo, DateTime и DateTimeOffset будут использовать эти данные на машинах, отличных от Windows.

    2. Вы можете принести свою собственную копию данных IANA TZDB черезбиблиотека, такая как время Noda .Затем вы можете запустить на любой ОС, которую вы хотите.Конечно, вам нужно оставаться в курсе, чтобы получать изменения в TZDB.

      Пример Noda Time для вашего сценария выглядит следующим образом:

      Instant utcTime = Instant.FromUtc(1944, 5, 21, 17, 30);
      DateTimeZone tz = DateTimeZoneProviders.Tzdb["Asia/Kolkata"];
      ZonedDateTime zdt = utcTime.InZone(tz);
      LocalDateTime ldt = zdt.LocalDateTime;
      
      Console.WriteLine(ldt.ToString("dd/MM/yyyy", CultureInfo.InvariantCulture));
      

      Есть, конечно, более короткие путичтобы написать это - и API в NodaTime для анализа, форматирования, манипуляции, преобразования и т. д. Но я думаю, вы поняли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...