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

时间:2014-11-29 05:04:00

标签: c# string datetime timezone

我想将字符串解析为时间。

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

当我更改设置中的时区时,日期应该相同。请帮我解决我的问题。

2 个答案:

答案 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 DateTimeDateTimeStyles是最佳选择。使用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 KindUtc

答案 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);