为什么在 javascript 中,创建日期在 1941 年 10 月 1 日至 1945 年 10 月 14 日之间,



我的时区是(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。

为什么在时区中为 1941 年 10 月 1 日至 1945 年 10 月 14 日之间的日期添加一个额外的小时。

当我在 C# 中转换 date1 时:

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

它给了我 21/05/1944而不是 22/05/1944。

如何在 C# 中获取正确的日期和时间?

几件事:

  • 事实上,印度在1940年代确实使用了UTC+6:30。 此信息记录在 IANA 时区数据库中。 你也可以参考印度的时间细节 这里.

  • .NET(在Windows上运行时(不使用IANA时区数据库,而是使用Microsoft Windows时区数据库。 您可以在时区标签 wiki 中阅读这两个数据集之间的一些差异。

  • Windows 时区数据库通常没有大多数时区的长期历史记录。 对于India Standard Time,它没有任何历史 - 假设UTC+5:30一直有效。 如果您的应用程序需要了解历史时区信息,则您有两种选择:

    1. 如果您使用的是.NET Core,则可以在使用完整IANA时区数据库的非Windows操作系统(Linux,MacOS等(上运行。 标准的TimeZoneInfoDateTimeDateTimeOffsetAPI 将在非 Windows 机器上使用这些数据。

    2. 您可以通过 Noda Time 等库自带 IANA TZDB 数据副本。 然后,您可以在所需的任何操作系统上运行。 当然,您需要保持更新才能对 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));
      

      当然,有更短的方法来编写它 - 以及NodaTime中用于解析,格式化,操作,转换等的API。 但我想你明白了。

相关内容

最新更新