我的时区是(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#中获取正确的日期和时间?
答案 0 :(得分:2)
几件事:
的确,在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一直有效。如果您的应用程序需要了解历史时区信息,则有两种选择:
如果使用的是.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。但是我想您明白了。