我正在使用 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/