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

时间:2014-10-22 11:21:12

标签: c# .net dst datetimeoffset

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

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

然而,它返回0.

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

4 个答案:

答案 0 :(得分:8)

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

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

还有其他例子here

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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

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名称:格林威治标准时间,支持DLS:错误

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();
}

答案 3 :(得分: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对象,“欧洲/伦敦”
  • 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();