我想将字符串解析为时间。
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
当我更改设置中的时区时,日期应该相同。请帮我解决我的问题。
答案 0 :(得分:3)
让我解释一下这里发生了什么..
通常,DateTime.Parse
方法返回DateTime
的{{3}}属性为Kind
。
但由于您的字符串包含时区信息,并且您使用DateTime.Parse
方法而没有Unspecified
重载(默认情况下使用DateTimeStyles.None
),因此DateTime
的{{1}属性将是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
为DateTimeStyles
是最佳选择。使用UTC方法是在Local
时间内完成此操作的一种方法。
来自文档;
协调世界时(UTC)等于当地时间减去 UTC偏移。
由于您的代码生成Local
时间,因此ToUniversalTime()
生成的日期时间在两个时区都是相同的。
另一种方法,使用DateTimeStyles.AdjustToUniversal
作为DateTime.Parse
方法中的第三个参数。
来自文档;
日期和时间以协调世界时(UTC)的形式返回。 如果 输入字符串表示通过时区说明符的本地时间 或AssumeLocal,日期和时间从当地时间转换为 UTC 即可。如果输入字符串表示UTC时间,则表示时区 说明符或AssumeUniversal,不发生转换。如果输入 string不表示本地或UTC时间,不发生转换 生成的Kind属性为Unspecified。
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
。
答案 1 :(得分:1)
最终解决方案
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);