如何判断是否英国夏令时
Posted
技术标签:
【中文标题】如何判断是否英国夏令时【英文标题】:How to tell if it's British Summer Time如何判断是不是英国夏令时 【发布时间】:2014-12-17 20:00:10 【问题描述】:我有以下代码,应该返回 60 的偏移量(以表明目前在英国,我们处于英国夏令时 - 即比格林威治标准时间提前 60 分钟):
var info = TimeZoneInfo.FindSystemTimeZoneById("Greenwich Standard Time");
DateTimeOffset localServerTime = DateTimeOffset.Now;
double off = localServerTime.Offset.TotalMinutes;
return off;
但是,它返回 0。
谁能帮我解决这个问题?
【问题讨论】:
你没有在任何地方使用info
。所以你的off
将是当前时区偏移量。
@vc74 这个问题具有误导性。 info
变量已初始化,但未使用。返回的偏移量仅基于DateTimeOffset.Now
。
有趣。这对我来说很好(捷克夏令时)。您确定您的服务器设置正确,时区正确吗?
@vc74 UTC == GMT,始终如此。您似乎是在说英国目前处于 GMT(或 UTC)而不是 BST,但我不认为这是正确的,***同意我的观点,即 BST 直到下周末才会结束。
BST 直到周日才结束,DateTimeOffset.Now.Offset.TotalMinutes
现在在英国为我返回 60。
【参考方案1】:
使用TimeZoneInfo.IsDaylightSavingTime Method (DateTimeOffset) 查看您所在时区当前是否为夏令时。
var info = TimeZoneInfo.FindSystemTimeZoneById("Greenwich Standard Time");
DateTimeOffset localServerTime = DateTimeOffset.Now;
bool isDaylightSaving = info.IsDaylightSavingTime(localServerTime);
还有更多例子here
【讨论】:
使用时区“格林威治标准时间”对我不起作用,因为它显然不支持夏令时。我不得不改用“GMT 标准时间”。【参考方案2】:如果您获得 0 并且居住在英国,则您的机器配置不正确。可能的原因是:
机器的时区设置不正确。点击任务栏上的时钟进行更正。 机器未配置为遵守夏令时。点击时钟。 TimeZoneInfo 查询夏令时规则的数据库已过期或已损坏。它存储在 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones 注册表项中。在进行根本性更改时要小心,如果配置错误,很可能是为了解决在服务器上运行的关键业务应用程序中的某种缺陷而故意进行的。与首先管理服务器的人交谈。
【讨论】:
【参考方案3】:另一种选择是使用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();
【讨论】:
【参考方案4】:要掌握从一个时区到另一个时区的转换,您需要了解哪些支持(如何?)哪些不支持。
foreach (var tz in TimeZoneInfo.GetSystemTimeZones())
Console.WriteLine("TimeZone Offset: 0 Name : 1, Supports DLS: 2", tz.BaseUtcOffset,tz.StandardName,tz.SupportsDaylightSavingTime);
这应该会为您提供所有时区的列表,包括有关 DayLightSaving 的信息。 请注意:
时区偏移: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();
【讨论】:
以上是关于如何判断是否英国夏令时的主要内容,如果未能解决你的问题,请参考以下文章