我想获取当地时间一天中的每个小时。对于没有夏令时的地方,这很容易,但是当 DST 开始或结束时,当天有 23 或 25 小时!
我编写此代码是为了正确获取它,但我想知道是否有更简单的方法使用 chrono 来编写函数 PrintHours()
#include <iostream>
#include <chrono>
using namespace std::chrono;
constexpr const char* zoneName = "Europe/Berlin";
void PrintHours(std::chrono::local_days date)
{
zoned_time utcTime{"UTC", zoned_time{zoneName, date}};
auto localTime = zoned_time{zoneName, utcTime};
auto dp = std::chrono::floor<days>(localTime.get_local_time());
// keep looping until day change!
for (auto startingDay = year_month_day{dp}.day(); startingDay == year_month_day{dp}.day(); dp = std::chrono::floor<days>(localTime.get_local_time()))
{
std::cout << zoneName << localTime<< " UTC: " << utcTime << std::endl;
// bump time to next hour
utcTime = zoned_time("UTC", utcTime.get_local_time() + hours(1));
localTime= zoned_time{zoneName, utcTime};
}
}
int main(int argc, char **argv)
{
using namespace std::chrono;
year_month_day ymd{year(2023), month(10), day(29)};
PrintHours(local_days(ymd));
return 1;
}
以下:
#include <bits/chrono.h>
#include <chrono>
#include <iostream>
using namespace std::chrono;
constexpr const char* zoneName = "Europe/Berlin";
void PrintHours(year_month_day day) {
auto hour = hours(1);
for (auto it = zoned_time(zoneName, local_days(day));
year_month_day(floor<days>(it.get_local_time())).day() == day.day();
it = zoned_time(zoneName, it.get_sys_time() + hour)) {
std::cout << it << '\n';
}
}
int main(int argc, char** argv) {
PrintHours(year_month_day{year(2023), month(10), day(29)});
return 1;
}
我的输出:
2023-10-29 00:00:00 CEST
2023-10-29 01:00:00 CEST
2023-10-29 02:00:00 CEST
2023-10-29 02:00:00 CET
2023-10-29 03:00:00 CET
2023-10-29 04:00:00 CET
2023-10-29 05:00:00 CET
2023-10-29 06:00:00 CET
2023-10-29 07:00:00 CET
2023-10-29 08:00:00 CET
2023-10-29 09:00:00 CET
2023-10-29 10:00:00 CET
2023-10-29 11:00:00 CET
2023-10-29 12:00:00 CET
2023-10-29 13:00:00 CET
2023-10-29 14:00:00 CET
2023-10-29 15:00:00 CET
2023-10-29 16:00:00 CET
2023-10-29 17:00:00 CET
2023-10-29 18:00:00 CET
2023-10-29 19:00:00 CET
2023-10-29 20:00:00 CET
2023-10-29 21:00:00 CET
2023-10-29 22:00:00 CET
2023-10-29 23:00:00 CET