gpt4 book ai didi

c++ - 查找给定年、月和 "nth"日在 C/C++ 月中出现的日期

转载 作者:行者123 更新时间:2023-11-28 06:07:33 27 4
gpt4 key购买 nike

为了让设备(内存有限)能够管理自己的时区和夏令时,我尝试根据每个时区的简化描述来计算 85 个时区的夏令时触发器。我可以访问设备中的最小 C 和 C++ 库。每个时区的时区(包括夏令时)描述格式如下:

  • UTC - 系统时钟的基准时间和日期
  • GMTOffsetMinutes - 与 GMT 的偏移量,夏令时不活动
  • DSTDeltaMinutes - DST 激活时的上述修正(适用于 TZ)
  • DSTStartMonth - DST 生效的月份
  • DSTStartNthOccurranceOfDay - 日期名称在月份中第 n 次出现
  • DSTDayOfWeek - 周日 = 0 到周六 = 6
  • DSTStartHour - DST 生效的时间
  • DSTStartMinute - DST 生效的分钟
  • 以及相应的 EndMonth、EndNth...、EndHour、EndMinute

我发现了许多相反的例子,即从日期开始,但它们涉及使用模数、保留余数并舍弃商数,因此我无法转置公式以满足我的需要。

我还尝试重用标准“Jan = 6、Feb = 2、Mar = 2、Apr = 5、May = 0 等”的修饰符表和年份修饰符“告诉我 6 月 25 日是哪一天, 2067 是?”党的把戏并开发了以下算法。

Date = DayOfWeek + ((NthOccuranceOfDay - 1) x 7 ) - MonthCode - YearCode

这适用于我选择的前 6 个随机测试日期,但随后我开始看到失败的日期。有没有可能基本算法是合理的,但我缺少进一步的修饰符,或者我可能错误地应用了修饰符?

我可以使用其他解决方案吗?

最佳答案

使用 this open source, cross platform date library ,可以这样写:

#include "date.h"
#include <iostream>

int
main()
{
using namespace date;
year_month_day us_daylight_starts = sys_days(sun[2]/mar/2015);
year_month_day us_daylight_ends = sys_days(sun[1]/nov/2015);
std::cout << us_daylight_starts << '\n';
std::cout << us_daylight_ends << '\n';
}

将输出:

2015-03-08
2015-11-01

该库所基于的公式属于公共(public)领域,并且 documented here .

算法论文有非常完整的单元测试,验证了数百万年范围内的日期算法(比必要的范围大得多)。

有时夏令时规则是根据一个月的最后个工作日编写的。这很容易处理:

year_month_day ymd = sys_days(sun[last]/nov/2015);
std::cout << ymd << '\n'; // 2015-11-29

关于c++ - 查找给定年、月和 "nth"日在 C/C++ 月中出现的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32098778/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com