忽略.NET中的DST(夏令时)

时间:2011-08-22 01:18:56

标签: c# .net dst

我正在尝试将String转换为Datetime对象,而不修改它并向Datetime对象添加额外的小时/偏移量。

这是代码:

string dateStr = "2011-03-18T12:07:00.000+10:00"; //Convert this string to datetime AS IS

DateTime date = Convert.ToDateTime(dateStr);

Console.WriteLine("Original string: " + dateStr);
Console.WriteLine("date toString:   " + date.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss.fffK"));

输出:

Original string: 2011-03-18T12:07:00.000+10:00
date toString:   2011-03-18T13:07:00.000+11:00

如果有人可以指出我如何忽略DST或者甚至将日期转换回我想要的日期时间对象,那将非常感激。

沿着修改日期时间的路径前进: 我试图将Datetime转换回来,但我无法弄清楚如何更改Datetime对象中的时区,当我使用DatetimeOffset对象来完成这项工作时,当我调用 DatetimeOffset.Datetime 时它返回没有偏移的日期时间

3 个答案:

答案 0 :(得分:3)

DateTime对象不包含时区。它只包含Kind,可以是UtcLocalUnspecified

调用Convert.ToDateTime时,如果存在任何偏移量,则会应用该偏移量,然后该值将转换为本地时区。那是 - 代码运行的时区。

然后,通过在输出格式中使用K,它返回该特定日期的本地时区的偏移量。

要正确处理此方案,请使用DateTimeOffset类型:

string dateStr = "2011-03-18T12:07:00.000+10:00";

DateTimeOffset dto = DateTimeOffset.Parse(dateStr);

Console.WriteLine("Original string: " + dateStr);
Console.WriteLine("dto toString:    " + dto.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss.fffK"));

关于你的陈述:

  

当我调用DatetimeOffset.Datetime时,它返回没有偏移的日期时间

这是正确的。只有DateTimeOffset类型具有要返回的偏移量。 DateTime对象只能返回机器的本地偏移量,对于带有DateTime的{​​{1}},只能返回零。

答案 1 :(得分:0)

.NET框架中的TimezoneInfo类可以提供答案(http://msdn.microsoft.com/en-us/library/system.timezoneinfo.aspx

string dateStr = "2011-03-18T12:07:00.000+10:00"; //Convert this string to datetime AS IS

DateTime localDateTime = DateTime.Parse(date); 

DateTime utcDateTime = localDateTime.ToUniversalTime();
string estKey = "Eastern Standard Time";
TimeZoneInfo estTimeZone = TimeZoneInfo.FindSystemTimeZoneById(estKey);
DateTime estDateTime = TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, estTimeZone);

Console.WriteLine("Original string: " + dateStr);
Console.WriteLine("date toString:   " + estDateTime);

答案 2 :(得分:-1)

DateTime dt = DateTime.Now.ToUniversalTime()+ TimeZoneInfo.Local.BaseUtcOffset;