【问题标题】:boost::locale::date_time: How to get data from date_time object in Boost C++?boost::locale::date_time:如何从 Boost C++ 中的 date_time 对象获取数据?
【发布时间】:2017-12-02 08:51:04
【问题描述】:

我正在尝试在我的代码中处理日期和时间,并且已经指向了 boost 库的方向——特别是 boost::locale::date_time(部分是因为这让我避免了夏令时的怪异使我以前的实现变得困难)。

但是,我得到的结果不一致。当我将日期存储在 date_time 对象中并稍后尝试从中获取数据时,这是不正确的。这是一个例子:

#include <boost\\asio\\error.hpp>
#include <boost\\locale.hpp>
using namespace std;

int main()
{
    // Necessary to avoid bad_cast exception - system default should be fine
    boost::locale::generator gen;
    std::locale::global(gen(""));

    // Create date_time of 12/19/2016
    boost::locale::date_time dt = boost::locale::period::year(2016) + boost::locale::period::month(12) + boost::locale::period::day(19);

    unsigned int month = dt.get(boost::locale::period::month());
    unsigned int day = dt.get(boost::locale::period::day());
    unsigned int year = dt.get(boost::locale::period::year());

    cout << month << "/" << day << "/" << year << endl;

    // Expected output:  12/19/2016
    // Actual output:    0/19/2017
}

我做错了什么?我只想提取保存的天数、月数、年数、小时数等。

谢谢。

编辑:我最初可能以不正确的方式设置 date_time。假设我拥有整数(不是字符串)格式的所有相关数据,是否有更好的方法来显式设置日期时间(例如,设置为 2016 年 12 月 19 日)?

【问题讨论】:

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


【解决方案1】:

2016-04-05 + 12 months = 2017-04-05。这是有道理的,因为 12 个月是一整年。

尝试添加 11 个月,然后递增以从基于 0 的月份调整为基于 1 的月份。

boost::locale::date_time dt = boost::locale::period::year(2016) + boost::locale::period::month(11) + boost::locale::period::day(19);

uint month = dt.get(boost::locale::period::month()) + 1;
uint day = dt.get(boost::locale::period::day());
uint year = dt.get(boost::locale::period::year());

cout << month << "/" << day << "/" << year << endl;

【讨论】:

  • 好的,假设我已经拥有整数格式的数据(即,我知道我说的是 2016 年 12 月 19 日),我该如何正确设置 date_time?也就是说,我怎么知道月份是从 0 开始的?我怎么知道天是从 0 开始的,还是日期时间的任何其他片段?还是有更好的方法来初始化已知的 date_time?
  • @user3236291 从月份值中减去 1。将January视为等同于0,将December视为等同于11,并在显示日期时进行调整。
  • @user3236291 如果您查看date_time 的文档,您会发现它在库本身中有更详细/更明确的示例,例如使用boost::locale::period::january() 来获得准确的个别月份的价值。
  • 我明白了。文档说天是从 1 开始的(不是从 0 开始的),所以我认为月份也是如此。这实际上是不正确的,文档说月份是从 0 开始的。感谢您的帮助!
  • @user3236291 “我怎么知道” ...您阅读了 docs - 例如for period::month: " 一年中的月份,特定于日历,采用公历 [0..11]"
猜你喜欢
  • 1970-01-01
  • 2022-10-16
  • 1970-01-01
  • 2011-09-02
  • 2016-08-15
  • 1970-01-01
  • 1970-01-01
  • 2015-06-07
  • 1970-01-01
相关资源
最近更新 更多