【问题标题】:c++ : get week number from yyyyMMddc++:从 yyyyMMdd 获取周数
【发布时间】:2014-09-28 06:12:45
【问题描述】:

我正在用 c++ 编写一个 impala udf,当在 yyyyMMdd 中提供日期时,它会获得一年中的一周。但似乎找不到在 c++ 中将 yyyyMMdd 转换为一年中的一周的方法。在java中我可以你日历,但是如何在c ++中进行。

TIA

【问题讨论】:

    标签: c++ datetime


    【解决方案1】:

    您可以只使用来自<ctime>std::mktime。示例:

    std::tm date={};
    date.tm_year=2014-1900;
    date.tm_mon=9-1;
    date.tm_mday=28;
    std::mktime(&date);
    

    调用后,date.tm_wday 被调整(0=星期日)。 date.tm_yday 也进行了调整。

    要获得一年中的一周,请使用:(date.tm_yday-date.tm_wday+7)/7

    此计算返回第一个完整周的 1(即一年中的第一周,其中包括星期日开始的年份的 1 月 1 日); 0 表示第一周的天数。

    【讨论】:

    • @H Walters: tm_wday 给出了周日以来的一天,但我想要的是那一年的周数。就像 java 中的 Calendar.week_of_year 一样。
    • 我不确定你是否可以做“就像”week_of_year,因为我不确定获取区域设置偏好是否容易。但是 mktime 也会为您填写 tm_yday ,例如 (date.tm_yday-date.tm_wday)/7 将是一个基础计数(注意边界情况 - 就像实际的第一周一样)。
    【解决方案2】:

    我回答了这个here,但为了完整起见,我也在这里重复一下:

    使用来自howardhinnant.github.io/iso_week.htmliso_week.h

    #include <iostream>
    #include "iso_week.h"
    
    int main() {
        using namespace iso_week;
        using namespace std::chrono;
        // Get the current time and floor to convert to the sys_days:
        auto today = floor<days>(system_clock::now());
        // Convert from sys_days to iso_week::year_weeknum_weekday format
        auto yww = year_weeknum_weekday{today};
        // Print current week number of the year
        std::cout << "The current week of " << yww.year() << " is: " 
                  << yww.weeknum() << std::endl;
    
        // Set any day
        auto any_day = 2014_y/9/28;
        // Get week of `any_day`
        std::cout << "The week of " << any_day.year() << " on `any day` was: " 
                  << any_day.weeknum() << std::endl;   
    }
    

    给出输出:

    The current week of 2019 is: W18
    The week in 2014 on `any day` was: W09
    

    【讨论】:

      【解决方案3】:

      使用 boost::date 库。简单易用。

      【讨论】:

        猜你喜欢
        • 2016-12-09
        • 1970-01-01
        • 1970-01-01
        • 2011-06-22
        • 1970-01-01
        • 1970-01-01
        • 2016-05-24
        • 1970-01-01
        • 2018-12-23
        相关资源
        最近更新 更多