【问题标题】:Ignoring DST (Daylight Saving Time) in .NET在 .NET 中忽略 DST(夏令时)
【发布时间】:2011-10-31 19:43:45
【问题描述】:

我正在尝试将 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 转换回来,但我无法弄清楚如何更改 Datetime 对象中的时区,当我使用 DatetimeOffset 对象来完成这项工作时,当我调用 DatetimeOffset.Datetime 它返回没有偏移量的日期时间

【问题讨论】:

  • 您使用的是什么版本的 .NET?
  • 这是在 .NET 3.5 中。有没有 Jon Skeet 的 Noda Time 的 URL?

标签: c# .net dst


【解决方案1】:

.NET framework 中的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);

【讨论】:

  • 感谢您的帮助,但不幸的是,我们使用该方法丢失了 estDatetime 中的偏移量。
【解决方案2】:

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 时,它​​会返回没有偏移量的 Datetime

没错。只有 DateTimeOffset 类型具有要返回的偏移量。 DateTime 对象只能返回机器的本地 偏移量,或者对于带有DateTimeKind.UtcDateTime 为零。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 这会正确应用给定的时区,同时忽略 DST,正如最初要求的那样。
    猜你喜欢
    • 1970-01-01
    • 2014-04-30
    • 1970-01-01
    • 2015-06-07
    • 2014-09-21
    • 1970-01-01
    • 2018-08-22
    • 1970-01-01
    • 2018-12-14
    相关资源
    最近更新 更多