C++ 为什么日历周编号在周一凌晨3点更新,而不是在午夜更新?

C++ 为什么日历周编号在周一凌晨3点更新,而不是在午夜更新?,c++,time,chrono,C++,Time,Chrono,我正在使用iso_week.hfrom来计算给定日期的周数。然而,它似乎在周一凌晨3点更新周数,而不是午夜 例如,这样的代码: #包括 #包括“iso_周.h” int main(){ 使用名称空间iso_周; 使用名称空间std::chrono; /*假设我们有两个时间点: *tp1对应时间:2019年7月15日星期一02:50:00 *tp2对应时间:2019年7月15日星期一03:00:00 */ //转换为系统天数的楼层时间点: 自动tp1_系统=地板(tp1); 自动tp2_系统=地板

我正在使用
iso_week.h
from来计算给定日期的周数。然而,它似乎在周一凌晨3点更新周数,而不是午夜

例如,这样的代码:

#包括
#包括“iso_周.h”
int main(){
使用名称空间iso_周;
使用名称空间std::chrono;
/*假设我们有两个时间点:
*tp1对应时间:2019年7月15日星期一02:50:00
*tp2对应时间:2019年7月15日星期一03:00:00
*/
//转换为系统天数的楼层时间点:
自动tp1_系统=地板(tp1);
自动tp2_系统=地板(tp2);
//从系统日转换为iso周::年周数周格式
auto yww1=年_周数_周日{tp1_sys};
自动yww2=年_周数_周日{tp2_系统};
//打印相应的年度周数

std::cout这可能与你所在的时区有关吗?我知道很多公司都位于东海岸和“iso_week.h”可能是基于那个时间,也就是说它可能在午夜运行,它只会告诉你它在凌晨3点运行。如果不是这样的话,只在晚上9点运行程序会不会是错误的?

起初我没有注意到你的评论:

// Floor time points to convert to the sys_days:
这意味着
tp1
tp2
基于
system\u clock
system\u clock
UTC型号

您可以使用tz.h标题(tz.cpp源代码)获取当前时区,将UTC时间点转换为本地时间点,然后将它们输入到
年\周\周
。这将把一天的开始定义为本地午夜,而不是UTC午夜

这看起来像:

#include "date/iso_week.h"
#include "date/tz.h"
#include <iostream>

int
main()
{
    using namespace iso_week;
    using namespace date;
    using namespace std::chrono;
    auto tp1 = floor<seconds>(system_clock::now());
    zoned_seconds zt{current_zone(), tp1};
    auto tp1_local = floor<days>(zt.get_local_time());
    auto yww1 = year_weeknum_weekday{tp1_local};
    std::cout << "Week of yww1 is: " << yww1.weeknum() << std::endl;
}
如果您希望以小于秒的精度工作,
zoned_seconds
只是
zoned_time
的类型别名。因此,请使用您需要的任何精度(例如
zoned_time


使用tz.h确实需要。它不仅仅是标题。

你能在代码中显示
tp1
tp2
值吗?我曾经遇到过一个类似的问题。结果是,crtl中内置了夏令时。@KorelK@HowardHinnant现在我看到了我的问题。tp1和tp2都是
std::chrono::system\u clock
时间点。Right、 我刚刚注意到你对
sys\u days
的评论。你想让我给出一个涉及tz.h的答案,在将时间点转换为你的本地时区后,再将其发送给iso\u week吗?@HowardHinnant这将是非常感谢的!
#include "date/iso_week.h"
#include "date/tz.h"
#include <iostream>

int
main()
{
    using namespace iso_week;
    using namespace date;
    using namespace std::chrono;
    auto tp1 = floor<seconds>(system_clock::now());
    zoned_seconds zt{current_zone(), tp1};
    auto tp1_local = floor<days>(zt.get_local_time());
    auto yww1 = year_weeknum_weekday{tp1_local};
    std::cout << "Week of yww1 is: " << yww1.weeknum() << std::endl;
}
zoned_seconds zt{"Europe/Athens", tp1};