如何使用std::chrono找到当前的工作日?

6
我只是想使用C++20 std::chrono打印当前工作日(本地时间)。
看起来很简单(一个两个三个)。
#include <chrono>
#include <iostream>

int main() {
  using namespace std::chrono;

  system_clock::time_point now = system_clock::now();
  // system_clock::time_point now = sys_days{June / 26d / 2023y} + 12h;

  weekday wd{floor<days>(now)};

#ifdef _WIN32
  std::cout << wd << "\n";
#else
  std::cout << wd.c_encoding() << " (Sunday = " << Sunday.c_encoding() << ")\n";
#endif

  return 0;
}

然而,这对我来说打印的是“Tue”(今天是星期一)。如果我将注释切换到手动定义的日期(本问题发布于2023年6月26日-0400),它会打印“Mon”。
  1. 如何正确地获取当前日期?
  2. now()日期为什么与sys_days/year_month_day不同?

编辑:我认为这是一个时区的问题,正如我的三个链接所示。不过,我无法使用std::chrono编译它。
#include <chrono>
#include <iostream>

int main() {
  using namespace std::chrono;

  auto now = std::chrono::system_clock::now();
  auto now_local = zoned_time{current_zone(), now}.get_local_time();
  sys_days now_local_in_days{floor<days>(now_local)}; // !!! no constructor available
  weekday wd{now_local_in_days};

#ifdef _WIN32
  std::cout << wd << "\n";
#else
  std::cout << wd.c_encoding() << "\n";
#endif

  return 0;
}

所以我猜我要添加:

  1. 如何将本地时间转换为工作日?

嗯,关于时区的问题。我的这个链接提到了这个。但是我无法让sys_days构造函数接受local_time作为参数。 - MHebes
嗯,关于时区的问题。我的这个链接提到了这个。然而,我无法让sys_days构造函数接受local_time作为参数。 - MHebes
now_local_in_days 需要具有 local_days 类型,而不是 sys_days - cpplearner
now_local_in_days 需要是 local_days 类型,而不是 sys_days - cpplearner
now_local_in_days 需要是 local_days 类型,而不是 sys_days 类型。 - undefined
1个回答

6

我想我弄明白了。

  1. 我应该如何在当前日期下正确地完成这个任务?

看起来这个方法有效:

#include <chrono>
#include <iostream>

int main() {
  using namespace std::chrono;

  auto now = std::chrono::system_clock::now();
  auto now_local = current_zone()->to_local(now);
  weekday wd{floor<days>(now_local)};

#ifdef _WIN32
  std::cout << wd << "\n";
#else
  std::cout << wd.c_encoding() << "\n";
#endif

  return 0;
}
  1. 为什么now()日期的行为与sys_days/year_month_day不同?

system_clock::time_point存储在UTC时间中。

当你调用now()时,它表示"当前的GMT时间"。从那时起,你所做的任何转换或舍入都是基于GMT时间的。我写这篇文章时已经很晚了,在本地时间上是星期一,但在GMT时间上已经是星期二了。

当你手动定义一个时间时,它也是以UTC时间为准,并且会被完全接受。所以我给它一个星期一的日历日期,隐式使用了GMT时间,结果非常好。

  1. 如何将本地时间转换为星期几?

请参考上面的内容。不确定我链接的帖子(使用HH的date库)和C++20之间有什么变化,但我最终的解决方案是有道理的。你可以使用当前时区来偏移底层的time_since_epoch()四个小时,然后将其缩小到一天/星期几。

回顾起来,所有这些都是显而易见的,但我想留下解释供后人参考。


1
很高兴你解决了问题。在你的写作中,唯一没有使用到的GMT/UTC参考是Zulu,所以我们会加上这个以确保完整 :) 祝你编程顺利。 - David C. Rankin
1
很高兴你解决了问题。在你的写作中,唯一没有使用到的GMT/UTC参考是Zulu时间,所以我们会加上这个以确保完整 :) 祝你编码顺利。 - David C. Rankin
1
很高兴你解决了问题。在你的写作中,唯一没有使用的GMT/UTC参考是Zulu,所以我们会加上这个以确保完整 :) 祝你编码顺利。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接