将字符串解析为DateTime,有时会增加1小时(时区)

时间:2016-01-27 15:00:27

标签: c# parsing datetime timezone

当我需要将字符串解析为日期时间时,我遇到了问题。有时它会增加一个小时,有时它不会。它有什么理由,因为我不想添加一个小时。

第一个例子完全符合我的需要。

string s = "2016-01-28T20:59:00.000+01:00";            
DateTime ds = DateTime.Parse(s); //gives: 28/01/2016 20:59:00

第二个例子增加了一个小时,我想知道为什么。

string ss = "2016-05-27T10:38:00.000+01:00";
DateTime dss = DateTime.Parse(ss); //gives: 27/05/2016 11:38:00

2 个答案:

答案 0 :(得分:7)

强烈怀疑这是因为您当前时区的夏令时。

看起来您的时区在1月份有UTC +01:00,但在5月份有UTC +02:00。这就是为什么你的第二个例子增加了一个 more 小时,因为它的偏移部分已经01:00小时了。

但不是DateTime - 因为你的字符串有UTC偏移 - 我会把它解析为DateTimeOffset

DateTimeOffset ds = DateTimeOffset.Parse(s);

现在,您将{28.01.2016 20:59:00 +01:00}{27.05.2016 10:38:00 +01:00}作为DateTimeOffset值保存在.DateTime.Offset属性中。

答案 1 :(得分:1)

SonorGönül的答案很明显。我想添加一个示例,通过将您的示例时间转换为具有相同偏移但具有不同夏令时设置的时区来演示时区的影响。

TimeZoneInfo noDaylightSavingTz = TimeZoneInfo.GetSystemTimeZones()
    .FirstOrDefault(x => x.SupportsDaylightSavingTime == false && x.BaseUtcOffset.Hours == 1);
string s = "2016-01-28T20:59:00.000+01:00";
DateTime ds = DateTime.Parse(s); //gives: 28/01/2016 20:59:00

string ss = "2016-05-27T10:38:00.000+01:00";
DateTime dss = DateTime.Parse(ss); //gives: 27/05/2016 11:38:00

if (noDaylightSavingTz != null)
{
    DateTime ds1 = TimeZoneInfo.ConvertTime(ds, noDaylightSavingTz);
    DateTime dss1 = TimeZoneInfo.ConvertTime(dss, noDaylightSavingTz);
}

ds1dss1将包含您输入的时间值,除非您由于某种原因未安装任何兼容的时区。