我的时区是 (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 time zone database中。您还可以引用detail of time in India here .
.NET(在 Windows 上运行时)不使用 IANA 时区数据库,而是使用 Microsoft Windows 时区数据库。您可以在 the timezone tag wiki 中了解这两个数据集之间的一些差异。 .
Windows 时区数据库通常没有大多数时区的长期历史记录。对于
印度标准时间
,它没有任何历史记录 - 假设 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。但我认为你明白了。
关于javascript - 为什么在 javascript 中,创建 1941 年 10 月 1 日到 1945 年 10 月 14 日之间的日期并添加 GMT+0630 作为时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52269349/