如何解析日期和时间取决于时区
本文关键字:取决于 时区 时间 何解析 日期 | 更新日期: 2023-09-27 18:32:22
我想将字符串解析为时间。
string inputDate = "1970-01-01T00:00:00+0000";
var dt = DateTime.Parse(inputDate, CultureInfo.InvariantCulture);
Console.WriteLine("Date==> " + dt);
它在印度时间(UTC +5.30
)工作正常。
但是当我在模拟器的设置中将时区更改为UTC -5
时,输出显示
12/31/1969 7:00:00 PM
当我在设置中更改时区时,日期应该相同。请帮助我解决我的问题。
让我解释一下这里发生了什么。
通常,DateTime
Kind
属性返回DateTime.Parse
方法将被Unspecified
。
但是由于您的字符串具有时区信息,并且您使用DateTime.Parse
方法而没有DateTimeStyles
重载(默认情况下它使用 DateTimeStyles.None
),因此您的 DateTime
的 Kind
属性将Local
。
这就是为什么当您在时区系统中使用代码UTC +05.30
它会生成类似这样的结果;
01/01/1970 05:00:00 AM
当您在UTC -05.00
时区系统中使用时,它会生成;
12/31/1969 7:00:00 PM // which is equal 12/31/1969 19:00:00 AM representation
这太正常了。
在这种情况下,当我在设置中更改时区时,日期应该相同。
将您的DateTime
作为 UTC 是最佳选择。使用ToUniversalTime()
方法是在Local
时间内做到这一点的一种方法。
来自文档;
协调世界时 (UTC) 等于本地时间减去 UTC 偏移量。
由于代码生成的时间Local
因此ToUniversalTime()
生成的日期时间在两个时区中将相同。
另一种方法是DateTime.Parse
方法中使用DateTimeStyles.AdjustToUniversal
作为第三个参数。
来自文档;
日期和时间以协调世界时 (UTC) 的形式返回。如果 输入字符串通过时区说明符表示本地时间 或假设本地,日期和时间从本地时间转换为 世界协调时。如果输入字符串表示 UTC 时间,则通过时区 说明符或假设通用,不发生转换。如果输入 字符串不表示本地或 UTC 时间,不发生转换,并且 生成的 Kind 属性为"未指定"。
string inputDate = "1970-01-01T00:00:00+0000";
var dt = DateTime.Parse(inputDate,
CultureInfo.InvariantCulture,
DateTimeStyles.AdjustToUniversal);
这将产生01/01/1970 00:00:00
Kind
Utc
。
最终解决方案
string givenDate = ("1970-01-01T00:00:00+0000");
DateTime d = DateTime.Parse(givenDate, System.Globalization.CultureInfo.InvariantCulture);
string ouputDate = d.ToUniversalTime().ToString("MMM d, yyyy h:m:s tt", System.Globalization.CultureInfo.InvariantCulture);