我一直在尝试霍华德的约会库.有很多例子可以获取自某一天午夜以来的秒数,但不是自该日所属的星期开始以来的秒数.按照示例我生成了这段代码:
using timepoint_t = std::chrono::time_point<
std::chrono::system_clock,
std::chrono::nanoseconds
>;
timepoint_t tp; // input
auto dp = std::chrono::floor<date::weeks>(tp); // output, should point to start of week?
Run Code Online (Sandbox Code Playgroud)
但结果是错误的.例如,tp:
2018-10-25T11:26:00.397836134Z
Run Code Online (Sandbox Code Playgroud)
会产生dp:
2018-10-25T00:00:00.000000000Z
Run Code Online (Sandbox Code Playgroud)
这是25日午夜,而不是21日午夜.产生正确输出的最直接方法是什么?
我得到了user1095108的自我回答,因为它得到了正确的答案.但是我想添加更多不适合评论的信息.
"一周的开始"并未得到普遍认同.星期一作为本周的开始,一些国家正如ISO标准一样.其他国家将周日视为本周的开始.该库试图在此问题上尽可能保持中立.
即使你确定了你正在瞄准的工作日,你也需要确定在寻找第二周开始时想要考虑的星球上的哪个位置.
从你的代码来看,我将假设:
对于以下代码,假设:
using namespace date;
using namespace std::chrono;
Run Code Online (Sandbox Code Playgroud)
只是为了防止事情变得过于冗长.
我要做的第一件事是将输入转换time_point为精度为秒的a:
auto tp = floor<seconds>(system_clock::now());
Run Code Online (Sandbox Code Playgroud)
然后,为了进行工作日计算,例如找到输入的工作日tp,人们将需要另一个time_point具有精确天数的计算:
auto dp = floor<days>(tp);
Run Code Online (Sandbox Code Playgroud)
你可以weekday直接从day-precision time_point(dp)构造一个,而不是通过形成一个更昂贵的计算year_month_weekday:
weekday{dp}
Run Code Online (Sandbox Code Playgroud)
然后(如你所示)减去自本周开始以来的天数:
dp -= weekday{dp} - Sunday;
Run Code Online (Sandbox Code Playgroud)
现在你有两个time_point:你的输入和一周的开始.您可以简单地减去它们以获得一周中的秒数:
std::cout << tp - dp << '\n';
Run Code Online (Sandbox Code Playgroud)
现在,floor<weeks>(tp)没有给你想要的结果的原因system_clock是Unix时间.此度量计算自1970-01-01 00:00:00 UTC以来的时间(忽略闰秒).1970-01-01是星期四.因此截断a system_clock::time_point到精确度weeks定义星期四的"星期开始".
为了获得更多乐趣,请计算当地时间周开始以来的秒数,这可能涉及夏令时调整.在这种情况下,计算有多个正确答案:你是否计算物理秒数,这使得几周没有确切的604800秒,或者你算上"日历秒"?例如,美国东部时间11月4日/美国东部时间凌晨1点(美国/纽约)1或2小时?一旦确定哪个是正确答案,该库就可以计算出来.