C# 如何判断它是否';英国夏季

C# 如何判断它是否';英国夏季,c#,.net,dst,datetimeoffset,C#,.net,Dst,Datetimeoffset,我有以下代码,它应该返回60的偏移量(以表明目前在英国,我们处于英国夏季时间,即比格林尼治标准时间提前60分钟): 但是,它返回0 有人能帮我解决这个问题吗?用于查找您所在时区的当前夏令时 var info = TimeZoneInfo.FindSystemTimeZoneById("Greenwich Standard Time"); DateTimeOffset localServerTime = DateTimeOffset.Now; bool isDaylightSaving = inf

我有以下代码,它应该返回60的偏移量(以表明目前在英国,我们处于英国夏季时间,即比格林尼治标准时间提前60分钟):

但是,它返回0

有人能帮我解决这个问题吗?

用于查找您所在时区的当前夏令时

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

还有更多示例

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

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

在进行彻底的更改时要小心,将其配置为错误很可能是有意为了解决服务器上运行的业务关键型应用程序中的某种缺陷。首先与管理服务器的人交谈。

要掌握从一个时区到另一个时区的转换,您需要了解哪些支持(如何支持?)哪些不支持

foreach (var tz in TimeZoneInfo.GetSystemTimeZones())
{
    Console.WriteLine("TimeZone Offset: {0} Name : {1}, Supports DLS: {2}", tz.BaseUtcOffset,tz.StandardName,tz.SupportsDaylightSavingTime);
}
这将为您提供所有时区的列表,包括有关DaylightSave的信息。 请注意:

时区偏移量: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();
}
另一个选择是使用

以下代码适用于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
    是表示英国时区的对象,“欧洲/伦敦”
  • zonedClock
    是一个表示系统时钟和英国时区的对象
  • ZoneDateTime
    是一个对象,表示时区中的当前日期和时间(“由基础时钟提供的当前时刻,调整到此对象的时区”)
  • 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();

您没有在任何地方使用
info
。因此,您的
关闭
将是当前时区偏移量。@vc74这个问题有误导性。
info
变量已初始化,但未使用。返回的偏移量仅基于
DateTimeOffset.Now
。有趣。这对我来说很好(捷克夏令时)。您确定您的服务器设置正确,时区正确吗?@vc74 UTC==GMT,始终正确。你似乎在说英国目前是格林尼治标准时间(或UTC)而不是英国夏令时,但我不相信这是正确的,维基百科也同意我的观点,即英国夏令时要到下周末才会结束。英国夏令时要到周日才结束,
DateTimeOffset.Now.Offset.TotalMinutes
为我现在在英国返回60。使用时区“格林威治标准时间”对我不起作用,因为它显然不支持夏令时。我不得不用“格林威治标准时间”来代替。
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();