如何解析日期和时间取决于时区

本文关键字:取决于 时区 时间 何解析 日期 | 更新日期: 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),因此您的 DateTimeKind 属性将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);