我的时区是(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一直有效。 如果您的应用程序需要了解历史时区信息,则您有两种选择:-
如果您使用的是.NET Core,则可以在使用完整IANA时区数据库的非Windows操作系统(Linux,MacOS等(上运行。 标准的
TimeZoneInfo
、DateTime
和DateTimeOffset
API 将在非 Windows 机器上使用这些数据。 -
您可以通过 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。 但我想你明白了。
-