当我需要将字符串解析为日期时间时,我遇到了问题。有时它会增加一个小时,有时不会。有什么理由这样做吗,因为我不想增加一个小时。
第一个示例正是我所需要的。
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
我强烈怀疑这是因为您当前时区的夏令时而发生的。
看起来您的时区在 1 月份UTC +01:00
,但在 5 月份UTC +02:00
。这就是为什么您的第二个示例再添加一个小时,因为它的偏移部分已经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}
作为保存在其.DateTime
和.Offset
属性中的DateTimeOffset
值。
Sonor Gö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);
}
ds1
和 dss1
将包含输入的时间值,除非您由于某种原因未安装任何兼容的时区。