检查夏令时是否有效

本文关键字:有效 是否 夏令时 检查 | 更新日期: 2023-09-27 18:34:44

如何检查丹麦夏令时是否生效,如果是,则在我的数据中添加 1 小时,否则不会?我有一个 xml 文件:

<day = "1"
month = "5"
sunrise ="06:30"
sunset ="21:30"
/>

检查夏令时是否有效

认为您需要将此 xml 转换为 DateTime,然后使用 TimeZoneInfo 类。

如果丹麦是您当地时间:

DateTime thisTime = DateTime.Now;
bool isDaylight = TimeZoneInfo.Local.IsDaylightSavingTime(thisTime);

否则,您需要获取丹麦时区:

DateTime thisTime = DateTime.Now;
// get Denmark Standard Time zone - not sure about that
TimeZoneInfo tst = TimeZoneInfo.FindSystemTimeZoneById("Denmark Standard Time");
bool isDaylight = tst.IsDaylightSavingTime(thisTime);

当我如上所述编码时 - 对于纽约,我在调试器中发现时间设置正确(包括 DST(

TimeZoneInfo nyTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
DateTime nyTime = GetLocalDateTime(DateTime.UtcNow, nyTimeZone);
if (nyTimeZone.IsDaylightSavingTime(nyTime))
    nyTime = nyTime.AddHours(1);
public static DateTime GetLocalDateTime(DateTime utcDateTime, TimeZoneInfo timeZone)
    {
        utcDateTime = DateTime.SpecifyKind(utcDateTime, DateTimeKind.Utc);
        DateTime time = TimeZoneInfo.ConvertTime(utcDateTime, timeZone);
        return time;
    }
您可以使用

TimeZoneInfo.IsDaylightSavingTime

DateTime theDate = new DateTime(2012, 5, 1); // may 1st
TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("Central European Standard Time");
bool isCurrentlyDaylightSavings = tzi.IsDaylightSavingTime(theDate);

这是一个通用测试,如果我的数学不正确,很高兴得到纠正。 就我而言,我只需要获得时区的 GMT 偏移量,无论它位于世界何处。

  int timezone;
  TimeZoneInfo localZone = TimeZoneInfo.Local;
  DateTime myTime = DateTime.Now;
  bool isDayLight = TimeZoneInfo.Local.IsDaylightSavingTime(myTime);
  if (isDayLight)
            timezone = Math.Abs(localZone.BaseUtcOffset.Hours) + 1;
  else
            timezone = Math.Abs(localZone.BaseUtcOffset.Hours);
  Debug.WriteLine("timezone is " + timezone);

我只是找到了当前时间,如果是在夏令时期间,则在 GMT 偏移量中添加 +1。

这适用于Visual Studio Express 2013。

这是我

可以在所有时区使用的简短解决方案:

DateTime utcTime = DateTime.Parse("30.10.2018 18:21:34")
DateTime localtime = ConvertUTCToLocalTime(utcTime);

public static DateTime ConvertUTCToLocalTime(DateTime UTCTime)
{
    var localZone = TimeZone.CurrentTimeZone;
    var offset = localZone.GetUtcOffset(UTCTime);
    var localTime = UTCTime.AddHours(offset.Hours);
    return localTime;
}

重要

myDateTime.IsDaylightSavingTime 确实返回正确的值...但。。。它至少精确到一天中的某个小时,仅通过日期是不够的。

例如,今年 (2019( 3/10/2019 02:00:00

通过,因为 myDateTime 将返回 false,但 3/10/2019 03:00:00 将返回 true。

基于上面提供的其他代码,我制作了一个完整的代码来运行和进行测试。变量 cityTz 正在接收 IANA 时区名称示例。IANA时区模式在Mac和Linux中使用(Windows使用不同的时区样式(。2020 年,纽约的夏令时 (DST( 将于 11 月 1 日结束。如果您测试下面的代码,则返回将为 FALSE,因为"theDate"是 11 月 2 日,即 DST 结束后的第二天。但是,如果您更改注释的行并将日期设置为 11 月 1 日(纽约的最后一个 DST 日期(,则返回将为 TRUE。

您可以在Mac或Linux终端键入中编译此程序:

csc testDST.cs

要运行程序,请执行以下操作:

mono testDST.exe

完整代码:

using System;
using System.Collections.Generic;
using System.Linq;
class Program{
    static void Main(string[] args)
    {
        string cityTz;
        //cityTz = "America/Sao_Paulo";
        cityTz = "America/New_York";
        //DateTime theDate = new DateTime(2020, 11, 1); //returns TRUE
        DateTime theDate = new DateTime(2020, 11, 2); //returns FALSE
        Console.WriteLine("Data: "+theDate);
        TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById(cityTz);
        bool isDaylight = tzi.IsDaylightSavingTime(theDate);
        Console.WriteLine("isDaylight this date in "+ cityTz +"?: "+ isDaylight);
    }
}

你需要做两件事:

  1. 呼叫IsAmbiguous
  2. 列表项IsDaylightSavingTime
if (TimeZoneInfo.Local.IsAmbiguousTime(unclearDate) || 
    TimeZoneInfo.Local.IsDaylightSavingTime(unclearDate))
        Console.WriteLine("{0} may be daylight saving time in {1}.", unclearDate, TimeZoneInfo.Local.DisplayName);

https://msdn.microsoft.com/en-us/library/bb460642(v=vs.110(.aspx