【问题标题】:Month from week number and year周数和年份的月份
【发布时间】:2016-06-25 04:52:57
【问题描述】:

假设我有: 周 = 13 年份 = 2016

boost 或标准库中是否有任何东西可以从这两个输入中获取月份编号(或名称)。

我知道一周可能会重叠超过一个月,因此任何其他建议都会有所帮助。

谢谢!

【问题讨论】:

  • 也许我可以得到一周的最后一天,然后使用日、周和年得到月份?
  • 我意识到最简单的方法就是询问。但是您真的应该只阅读文档:boost.org/doc/libs/1_60_0/doc/html/date_time.html,搜索一些示例。 (顺便说一句,以防我太微妙:这是我告诉你 rtfm 的方式)
  • @bolov 谢谢。我提到了 boost::date_time 但到目前为止还没有找到方法。我无法使用我拥有的输入创建 boost::gregorian::date 对象。检查了其他功能和算法,但似乎没有合适的。如果您能提供任何提示,我将不胜感激。
  • 我不使用 boost::date_time,但第一次谷歌搜索给了我这个:date weekstart(2002,Feb,1); date weekend = weekstart + week(1);。从这里您可以轻松适应以获得所需的内容:(从 2016 年 1 月 1 日开始,获取日期,以便查看一年中第一周的开始时间,添加第(13)周,瞧,您将获得第 13 周的第一天2016 年的。同样,从未使用过它,因此无法为您提供更多帮助,但在我看来,您拥有所需的一切。如果您仍有问题,请编辑此问题,包括您尝试的代码以及卡在哪里。
  • 谢谢@bolov。让它工作!

标签: c++ boost boost-date-time


【解决方案1】:

如果您愿意使用非 boost 且使用 C++11 或更高版本的免费开源库,请查看:

https://github.com/HowardHinnant/date

示例代码:

#include "date.h"
#include "iso_week.h"
#include <iostream>

int
main()
{
    using namespace iso_week::literals;
    auto ymd = date::year_month_day{2016_y/13_w/mon};
    std::cout << ymd << '\n';
}

这个输出:

2016-03-28

ymd 对象上有 year()month()day() getter。

上面的链接有完整的文档。 "date.h" 和 "iso_week.h" 只是标题,因此无需链接到任何其他来源。

这些计算严格遵循here 概述的 ISO 周年规则。一年的第一周从前一年 12 月最后一个星期四之后的星期一开始。这意味着有时某个日期的 ISO 年与公历年不同。例如2016_y/jan/1 == 2015_y/53_w/fri,而在这个伪代码中2016_y2015_y 具有不同的类型(date::yeariso_week::year),因此它们不会被意外混淆。 C++ 类型系统会在编译时发现意外的歧义。

换个方向也一样容易:

#include "date.h"
#include "iso_week.h"
#include <iostream>

int
main()
{
    using namespace date::literals;
    auto iso = iso_week::year_weeknum_weekday{2016_y/mar/28};
    std::cout << iso << '\n';
}

哪个输出:

2016-W13-Mon

在 C++14 中,如果您的输入是编译时常量,则结果可以是 constexpr(编译时计算)。 (需要比 VS-2015 目前支持的更多 constexpr 肌肉)

【讨论】:

    【解决方案2】:
    #include <boost/date_time/gregorian/gregorian.hpp>
    
    using namespace boost::gregorian;
    
    // Initialize variables with some values
    int week_nmb = 13, year = 2017;
    
    date d = date(year, Jan, 1) + weeks(week_nmb);
    
    int month = d.month();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-06
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-29
      相关资源
      最近更新 更多