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

6
我有以下代码,它应该返回一个偏移量为60(表示目前英国处于英国夏令时,即比格林威治标准时间提前60分钟):
var info = TimeZoneInfo.FindSystemTimeZoneById("Greenwich Standard Time");
DateTimeOffset localServerTime = DateTimeOffset.Now;
double off = localServerTime.Offset.TotalMinutes;
return off;

然而,它返回了0。
请问有人能帮我修复这个问题吗?

你没有在任何地方使用 info。因此,你的 off 将是当前时区偏移量。 - Soner Gönül
1
@vc74 这个问题有误导性。info变量被初始化但是没有被使用。返回的偏移量仅基于DateTimeOffset.Now - user743382
有趣。对我来说很好用(捷克夏令时)。你确定你的服务器设置正确,使用了适当的时区吗? - Luaan
@vc74 UTC等同于GMT,始终如一。您似乎在说英国目前处于GMT(或UTC)而不是BST,但我不认为这是正确的,维基百科也同意我,BST直到下个周末才结束。 - user743382
1
BST直到周日才结束,而DateTimeOffset.Now.Offset.TotalMinutes现在对我来说在英国返回60。 - Ben Robinson
@hvd,您是正确的,所以在这种情况下服务器必须配置为GMT。 - vc 74
4个回答

16

7
使用时区"格林威治标准时间"对我来说不起作用,因为它显然不支持夏令时。我必须使用"GMT标准时间"代替。 - Zhorian

0
另一个选择是使用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对象,表示英国的时区,"Europe/London"
  • zonedClock 是一个ZonedClock对象,代表系统时钟和英国的时区
  • zonedDateTime 是一个ZonedDateTime对象,表示时区中的当前日期和时间(“根据此对象的时区调整底层时钟提供的当前时刻”)
  • isDST 是一个布尔值,指示当前时刻是否处于夏令时。在撰写本文时(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();

0

如果您在英国并且得到了0,那么您的机器配置不正确。可能的原因是:

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

要小心进行根本性的更改,配置错误可能是有意为之的,以解决运行在服务器上的业务关键应用程序中的某些缺陷。首先与管理服务器的人员交谈。


0
要掌握从一个时区到另一个时区的转换,您需要了解支持哪些(如何?)以及不支持哪些。
foreach (var tz in TimeZoneInfo.GetSystemTimeZones())
{
    Console.WriteLine("TimeZone Offset: {0} Name : {1}, Supports DLS: {2}", tz.BaseUtcOffset,tz.StandardName,tz.SupportsDaylightSavingTime);
}

这应该会给你一个包含有关夏令时信息的所有时区列表。

请注意:

时区偏移量:00:00:00 名称:格林威治标准时间,支持DLS:False

时区偏移量: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();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接