【问题标题】:Why in javascript, creating date between 1st October 1941 and 14th October 1945 adding GMT+0630 as time zone为什么在 javascript 中,在 1941 年 10 月 1 日和 1945 年 10 月 14 日之间创建日期,添加 GMT+0630 作为时区
【发布时间】:2018-09-11 05:43:12
【问题描述】:

我的时区是 (UTC +05:30)Chennai, Kolkata, Mumbai, New Delhi。

例如:

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# 中获取正确的日期和时间?

【问题讨论】:

  • 假设,根据 Wiki 文章:en.wikipedia.org/wiki/…:“简而言之,在第二次世界大战期间,印度标准时间下的时钟提前一小时,称为战争时间。这规定从 1942 年 9 月 1 日持续到 1945 年 10 月 15 日"
  • C# 将 - 假设 .NET - 使用 Windows TZ 信息(取决于 Windows 版本和底层系统调用),并且 JavaScript 规则可能因实现而异..
  • 是的,我正在使用 asp.net mvc 4。我如何使用 TZ 信息处理这个问题。请详细说明。

标签: javascript c# date timezone


【解决方案1】:

一些事情:

  • 确实,印度在 1940 年代的几个时期确实使用 UTC+6:30。此信息记录在IANA time zone database 中。也可以参考detail of time in India here

  • .NET(在 Windows 上运行时)不使用 IANA 时区数据库,而是使用 Microsoft Windows 时区数据库。您可以在the timezone tag wiki 中了解这两个数据集之间的一些差异。

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

    1. 如果您使用的是 .NET Core,则可以在使用完整 IANA 时区数据库的非 Windows 操作系统(Linux、MacOS 等)上运行。标准的 TimeZoneInfoDateTimeDateTimeOffset API 将在非 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。但我认为你明白了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-17
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 2015-10-10
    • 2019-11-23
    • 1970-01-01
    相关资源
    最近更新 更多