如何枚举一天中的每个小时

问题描述 投票:0回答:1

我想获取当地时间一天中的每个小时。对于没有夏令时的地方,这很容易,但是当 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;
}
c++ c++20 c++-chrono
1个回答
0
投票

以下:

#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
© www.soinside.com 2019 - 2024. All rights reserved.