我正在使用 Arduino 和实时时钟芯片。该芯片补偿了闰年等,因此它始终具有正确的日期,但我认为由于区域复杂性,它不处理夏令时。时钟可以给出日、月、年(从 1 开始)以及星期几(星期日 = 0 到星期六 = 6)。
因为我需要与用户输入的日期和时间进行比较,所以我需要知道针对夏令时调整的日期和时间。如果当前日期是夏令时,我可以简单地在时钟时间上添加一个小时,我就得到了我需要的东西。
困难的部分是确定我是否处于夏令时,因为夏令时每年都会变化。我只关心它在我所在的位置(山区时间)是否有效。我的平台似乎没有任何全面的日期库,而且我觉得无论如何这都太过分了。有没有一个简单的公式可以确定我是否处于夏令时?
这实际上非常简单。有一些事实可以帮助我们:
- 在美国大部分地区,DST 从 3 月的第二个星期日开始,到 11 月的第一个星期日结束,两次都是凌晨 2:00。
- 3 月的第二个星期日始终在 8 日至 14 日之间(含 8 日和 14 日)。
- 11 月的第一个星期日始终在 1 日到 7 日之间(含 1 日和 7 日)。
- 星期编号非常方便,因为星期几将为您提供前一个星期日。
这些事实导致了以下代码(C#,但可以轻松移植到您的平台):
public bool IsDST(int day, int month, int dow)
{
//January, february, and december are out.
if (month < 3 || month > 11) { return false; }
//April to October are in
if (month > 3 && month < 11) { return true; }
int previousSunday = day - dow;
//In march, we are DST if our previous sunday was on or after the 8th.
if (month == 3) { return previousSunday >= 8; }
//In november we must be before the first sunday to be dst.
//That means the previous sunday must be before the 1st.
return previousSunday <= 0;
}
事实证明,您甚至不需要知道年份即可执行此操作,只要您可以相信您的星期几值即可。
我编写了一个快速单元测试并验证了该代码是否符合TimeZone.IsDayLightSavingsTime()
对于从 1800 到 2200 的所有日期。我没有考虑凌晨 2 点规则,但您可以轻松地检查星期几是否是星期日,并且日期是否在 8 日到 14 日(三月)或 1 日到 7 日(三月)之间十一月)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)