c++ - 如何使用 date.h 在 C++ 中获取当前星期几?

标签 c++ date c++14 c++-chrono dayofweek

我正在使用 C++ 14 并尝试获取星期几。经过一番阅读后,我正在使用 date.h Howard E. Hinnant 着。

但是我很难找到一周中的某一天(编码为 0 到 6)。

像这样打印出 Thu:

 int main(void)
 {
     date::sys_days t;
     weekday wd{t};
     cout << wd << '\n';
 }

此站点上有关使用 chrono 获取当前星期几的许多答案。

如何使用 date.h 根据程序运行时间将当前工作日打印为 0-6 范围内的日期?

例如,如果我今天(星期二)运行该程序,我期望值为 2。

如有任何建议,我们将不胜感激。


只是为了清楚我想要实现的目标,Java 中的一些类似的东西:

Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("Europe/London"));
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);

最佳答案

您的代码的问题是 t 没有被初始化为任何有趣的东西。你只需要将它设置为“现在”。不过有一个小问题:now() 返回一种不同类型的时间点,它不能自动转换为 date::sys_days 值。

因此,这里是使您的程序正常运行的最小更改:

#include "date.h"
#include <iostream>
#include <cstdint>
   
int main()
{
     auto now = std::chrono::system_clock::now();
     date::sys_days t { std::chrono::time_point_cast<date::days>(now) };
     date::weekday wd{t};
     std::cout << wd << '\n';
}

编辑:现在让我们做更多的事情,感谢@HowardHinnant 提供的信息性评论。

使用更有意义的名字

main() 的代码替换为

auto now = std::chrono::system_clock::now();
date::sys_days now_in_days { std::chrono::time_point_cast<date::days>(now) };
date::weekday weekday {now_in_days};
std::cout << weekday << '\n';

以数字形式获取工作日

你说你想得到星期几的数字。好吧,我们可以做到:

auto weekday_index = weekday.c_encoding();

类型将是unsigned,值将在 0...6 范围内

获取您所在时区的工作日

到目前为止,你的代码和我的代码都是 UTC。这作为默认设置很好,但在工作日可能会给您带来惊喜。我们可以使用 zoned_time 并写:

auto now = std::chrono::system_clock::now();
auto now_local = zoned_time{current_zone(), now}.get_local_time();
date::sys_days now_local_in_days { std::chrono::time_point_cast<date::days>(now_local) };
date::weekday weekday {now_local_in_days};
auto weekday_index = weekday.c_encoding();

获取纪元(1970 年)之前的日期

这非常烦人,但是 time_point_cast() 可能并不总是如您所愿!霍华德说,在 1970 年之前的几天里,我们需要改用 floor():

date::sys_days now_local_in_days { std::chrono::floor<date::days>(now_local) };

最终程序

#include "date.h"
#include <iostream>
#include <cstdint>
   
int main()
{
    auto now = std::chrono::system_clock::now();
    auto now_local = zoned_time{current_zone(), now}.get_local_time();
    date::sys_days now_local_in_days { std::chrono::floor<date::days>(now_local) };
    date::weekday weekday {now_local_in_days};
    auto weekday_index = weekday.c_encoding();
    std::cout << weekday_index << '\n';
}

如果今天是星期二,结果输出应该是 2

关于c++ - 如何使用 date.h 在 C++ 中获取当前星期几?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57569940/

相关文章:

c++ - 在 QGraphicsView 中创建自动滚动功能

python - 当时间为 00 :00:00? 时,如何阻止 python 将 mySQL DATETIME 转换为 datetime.date

java - 日期到 XMLGregorianCalendar 转换给出错误结果

javascript - 如何查找最小/最大日期 javascript

c++ - 为什么lambda init-capture对于unique_ptr不起作用?

c++ - 如何阻止用户在 C++ 中输入更多内容?

c++ - 如何为类变量实现虚函数覆盖

c++ - 纯虚函数问题

c++ - 基类和派生类中的模板成员之间的重载解析

c++ - 每当使用 constexpr 指定调用的函数时,将委托(delegate)方法声明为 constexpr