如何判断它是否是英国夏令时

我有以下代码,它应该返回60的偏移量(显示目前在英国,我们在英国夏令时 – 即比格林威治标准时间早60分钟):

var info = TimeZoneInfo.FindSystemTimeZoneById("Greenwich Standard Time"); DateTimeOffset localServerTime = DateTimeOffset.Now; double off = localServerTime.Offset.TotalMinutes; return off; 

但是,它返回0。

有谁可以帮我解决这个问题?

使用TimeZoneInfo.IsDaylightSavingTime方法(DateTimeOffset)查找当前是否为您的时区保存夏令时。

 var info = TimeZoneInfo.FindSystemTimeZoneById("Greenwich Standard Time"); DateTimeOffset localServerTime = DateTimeOffset.Now; bool isDaylightSaving = info.IsDaylightSavingTime(localServerTime); 

这里还有其他例子

如果您获得0并且居住在英国,则您的计算机配置不正确。 可能的原因是:

  • 机器的时区设置不正确。 单击任务栏上的时钟进行更正。
  • 机器未配置为观察夏令时。 点击时钟。
  • TimeZoneInfo为夏令时规则提供咨询的数据库已过期或已损坏。 它存储在HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Time Zones注册表项中。

小心做出彻底的改变,如果配置错误,可能会故意在服务器上运行的关键业务应用程序中解决某些缺陷。 与任何管理服务器的人交谈。

另一种选择是使用Noda Time 。

以下代码适用于Noda Time 1.4及更高版本:

 var zone = NodaTime.TimeZones.TzdbDateTimeZoneSource.Default.ForId("Europe/London"); var zonedClock = NodaTime.SystemClock.Instance.InZone(zone); var zonedDateTime = zonedClock.GetCurrentZonedDateTime(); bool isDST = zonedDateTime.IsDaylightSavingTime(); Console.WriteLine(isDST); 
  • zone是一个DateTimeZone对象,代表英国的时区,“欧洲/伦敦”
  • zonedClock是一个ZonedClock对象,在这种情况下,它表示系统时钟和英国的时区
  • zonedDateTime是一个ZonedDateTime对象,表示时区中的当前日期和时间(“基础时钟提供的当前时刻,调整为此对象的时区”)
  • isDST是一个布尔值,指示当前时刻是否在DST中。 在撰写本文时(2018年4月),评估结果为true

对于早期版本的Noda, ZonedClock不可用,我们可以这样做:

 var zone = NodaTime.TimeZones.TzdbDateTimeZoneSource.Default.ForId("Europe/London"); var now = Instant.FromDateTimeOffset(DateTimeOffset.Now); var zonedDateTime = new ZonedDateTime(now, zone); bool isDST = zonedDateTime.IsDaylightSavingTime(); 

要掌握从一个时区到另一个时区的转换,您需要查看支持的内容(如何?)以及不支持的内容。

 foreach (var tz in TimeZoneInfo.GetSystemTimeZones()) { Console.WriteLine("TimeZone Offset: {0} Name : {1}, Supports DLS: {2}", tz.BaseUtcOffset,tz.StandardName,tz.SupportsDaylightSavingTime); } 

这应该为您提供所有时区的列表,包括有关DayLightSaving的信息。 请注意:

TimeZone Offset:00:00:00名称:Greenwich标准时间,支持DLS:False

TimeZone Offset:00:00:00名称:GMT标准时间,支持DLS:True

因此,您需要使用“GMT标准时间”,因为它已经支持夏令时。 不需要做任何工作。

这是示例代码:

 private static string GetBSTTimeStamp(string timestamp) { DateTime dt = DateTime.Parse(timestamp); //TimeZoneInfo bst = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time"); //Console.WriteLine("Time zone supports dls? {0}", bst.SupportsDaylightSavingTime); //Console.WriteLine("Time zone offset? {0}", bst.BaseUtcOffset); DateTime dateTimeInUtc = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(dt, "Eastern Standard Time", "GMT Standard Time"); return dateTimeInUtc.ToString(); }