如何使用 date.h 在 C++ 中获取当前星期几?
How do I get the current day of week in C++ using date.h?
我正在使用 C++ 14 并试图获取当前星期几。经过一些阅读后,我正在使用 Howard E. Hinnant 的 date.h。
但是我很难找到星期几(编码为 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);
这将使用 date.h:
给出当日指数
using namespace date;
using namespace std::chrono;
auto now = system_clock::now();
std::cout << "The current time is " << now << " UTC\n";
auto current_day = (year_month_weekday{floor<days>(now)}.weekday() - Sunday).count();
std::cout << "current_day " << current_day << "\n";
你也可以使用std::time_get::get_weekday
#include <iostream> // std::cout, std::ios
#include <sstream> // std::istringstream
#include <ctime> // std::tm
#include <locale> // std::locale, std::time_get, std::use_facet
int main ()
{
std::locale loc; // classic "C" locale
// get time_get facet:
const std::time_get<char>& tmget = std::use_facet <std::time_get<char> > (loc);
std::ios::iostate state;
std::istringstream iss ("Friday");
std::tm when;
tmget.get_weekday (iss, std::time_get<char>::iter_type(), iss, state, &when);
std::cout << "weekday: " << when.tm_wday << '\n';
return 0;
}
或:
time_t t = time(nullptr);
tm* timePtr = localtime(&t);
uint32_t y = timePtr->tm_year + 1900;
uint32_t m = timePtr->tm_mon + 1;
uint32_t d = timePtr->tm_wday;
cout<< d<<endl;
您的代码的问题是 t
没有被初始化为任何有趣的东西。你只需要将它设置为“现在”。不过有一个小问题:now()
returns 一种不同类型的时间点,无法自动转换为 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++ 14 并试图获取当前星期几。经过一些阅读后,我正在使用 Howard E. Hinnant 的 date.h。
但是我很难找到星期几(编码为 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);
这将使用 date.h:
给出当日指数using namespace date;
using namespace std::chrono;
auto now = system_clock::now();
std::cout << "The current time is " << now << " UTC\n";
auto current_day = (year_month_weekday{floor<days>(now)}.weekday() - Sunday).count();
std::cout << "current_day " << current_day << "\n";
你也可以使用std::time_get::get_weekday
#include <iostream> // std::cout, std::ios
#include <sstream> // std::istringstream
#include <ctime> // std::tm
#include <locale> // std::locale, std::time_get, std::use_facet
int main ()
{
std::locale loc; // classic "C" locale
// get time_get facet:
const std::time_get<char>& tmget = std::use_facet <std::time_get<char> > (loc);
std::ios::iostate state;
std::istringstream iss ("Friday");
std::tm when;
tmget.get_weekday (iss, std::time_get<char>::iter_type(), iss, state, &when);
std::cout << "weekday: " << when.tm_wday << '\n';
return 0;
}
或:
time_t t = time(nullptr);
tm* timePtr = localtime(&t);
uint32_t y = timePtr->tm_year + 1900;
uint32_t m = timePtr->tm_mon + 1;
uint32_t d = timePtr->tm_wday;
cout<< d<<endl;
您的代码的问题是 t
没有被初始化为任何有趣的东西。你只需要将它设置为“现在”。不过有一个小问题:now()
returns 一种不同类型的时间点,无法自动转换为 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
。