【BOOST C++ 10 时间数据】(2)本地独立时间

发布于:2022-11-08 ⋅ 阅读:(466) ⋅ 点赞:(0)

一、说明

        boost::posix_time::ptime 类定义了一个与位置无关的时间。它使用 boost::gregorian::date 类型,但也存储时间。要使用 boost::posix_time::ptime,请包含头文件 boost/date_time/posix_time/posix_time.hpp。

二、库示例代码

        示例 36.10。使用 boost::posix_time::ptime

#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/date_time/gregorian/gregorian.hpp>
#include <iostream>

using namespace boost::posix_time;
using namespace boost::gregorian;

int main()
{
  ptime pt{date{2014, 5, 12}, time_duration{12, 0, 0}};
  date d = pt.date();
  std::cout << d << '\n';
  time_duration td = pt.time_of_day();
  std::cout << td << '\n';
}

        要初始化 boost::posix_time::ptime 类型的对象,请将 boost::gregorian::date 类型的日期和 boost::posix_time::time_duration 类型的持续时间作为第一个和第二个参数传递给构造函数。 boost::posix_time::time_duration 的构造函数接受三个参数,它们决定了时间。示例 36.10 指定 2014 年 5 月 12 日下午 12 点作为时间点。要查询日期和时间,请使用成员函数 date() 和 time_of_day()。

        正如 boost::gregorian::date 的默认构造函数创建了一个无效的日期, boost::posix_time::ptime 的默认构造函数创建了一个无效的时间。也可以通过将 boost::date_time::not_a_date_time 传递给构造函数来显式创建无效时间。 Boost.DateTime 提供独立函数和成员函数来创建时间,这些时间类似于用于创建 boost::gregorian::date 类型的日历日期。

        示例 36.11。使用时钟或字符串创建时间点

#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/date_time/gregorian/gregorian.hpp>
#include <iostream>

using namespace boost::posix_time;

int main()
{
  ptime pt = second_clock::universal_time();
  std::cout << pt.date() << '\n';
  std::cout << pt.time_of_day() << '\n';

  pt = from_iso_string("20140512T120000");
  std::cout << pt.date() << '\n';
  std::cout << pt.time_of_day() << '\n';
}

        boost::posix_time::second_clock 类返回当前时间。成员函数 Universal_time() 返回 UTC 时间(参见示例 36.11)。 local_time() 返回本地时间。如果您需要更高的分辨率, boost::posix_time::microsec_clock 返回当前时间,包括微秒。

        独立函数 boost::posix_time::from_iso_string() 将存储在使用 ISO 8601 标准格式化的字符串中的时间转换为 boost::posix_time::ptime 类型的对象。

        示例 36.12。使用 boost::posix_time::time_duration

#include <boost/date_time/posix_time/posix_time.hpp>
#include <iostream>

using namespace boost::posix_time;

int main()
{
  time_duration td{16, 30, 0};
  std::cout << td.hours() << '\n';
  std::cout << td.minutes() << '\n';
  std::cout << td.seconds() << '\n';
  std::cout << td.total_seconds() << '\n';
}

        Boost.DateTime 还提供了类 boost::posix_time::time_duration,它指定了一个持续时间。这个类之前已经提到过,因为 boost::posix_time::ptime 的构造函数需要一个 boost::posix_time::time_duration 类型的对象作为它的第二个参数。您也可以独立使用 boost::posix_time::time_duration。

        hours()、minutes() 和 seconds() 返回持续时间的各个部分,而返回总秒数的成员函数(如 total_seconds())提供附加信息(参见示例 36.12)。您可以合法地传递给 boost::posix_time::time_duration 的值没有上限,例如 24 小时。

        示例 36.13。处理时间点

#include <boost/date_time/posix_time/posix_time.hpp>
#include <iostream>

using namespace boost::posix_time;
using namespace boost::gregorian;

int main()
{
  ptime pt1{date{2014, 5, 12}, time_duration{12, 0, 0}};
  ptime pt2{date{2014, 5, 12}, time_duration{18, 30, 0}};
  time_duration td = pt2 - pt1;
  std::cout << td.hours() << '\n';
  std::cout << td.minutes() << '\n';
  std::cout << td.seconds() << '\n';
}

        与日历日期一样,可以使用时间点和持续时间进行计算。如果将 boost::posix_time::ptime 类型的两次时间相减,如示例 36.13 所示,则结果是 boost::posix_time::time_duration 类型的对象,它指定两次之间的持续时间。

        示例 36.14。处理持续时间

#include <boost/date_time/posix_time/posix_time.hpp>
#include <iostream>

using namespace boost::posix_time;
using namespace boost::gregorian;

int main()
{
  ptime pt1{date{2014, 5, 12}, time_duration{12, 0, 0}};
  time_duration td{6, 30, 0};
  ptime pt2 = pt1 + td;
  std::cout << pt2.time_of_day() << '\n';
}

        如示例 36.14 所示,可以将持续时间添加到时间,从而产生新的时间点。此示例将 18:30:00 写入标准输出流。

        Boost.DateTime 对日历日期和时间使用相同的概念。就像有时间和持续时间的课程一样,也有时间段的课程。对于日历日期,这是 boost::gregorian::date_period;有时它是 boost::posix_time::time_period。两个类的构造函数都需要两个参数: boost::gregorian::date_period 需要两个日历日期作为参数, boost::posix_time::time_period 需要两个时间点。

        示例 36.15。使用 boost::posix_time::time_period

#include <boost/date_time/posix_time/posix_time.hpp>
#include <iostream>

using namespace boost::posix_time;
using namespace boost::gregorian;

int main()
{
  ptime pt1{date{2014, 5, 12}, time_duration{12, 0, 0}};
  ptime pt2{date{2014, 5, 12}, time_duration{18, 30, 0}};
  time_period tp{pt1, pt2};
  std::cout.setf(std::ios::boolalpha);
  std::cout << tp.contains(pt1) << '\n';
  std::cout << tp.contains(pt2) << '\n';
}

        一般来说, boost::posix_time::time_period 的工作方式与 boost::gregorian::date_period 类似。它提供了一个成员函数 contains(),该函数对时间段内的每个时间点都返回 true。因为传递给 boost::posix_time::time_period 的构造函数的结束时间不是周期的一部分,所以示例 36.15 中对 contains() 的第二次调用返回 false。

        boost::posix_time::time_period 提供了额外的成员函数,如intersection() 和merge(),分别计算两个重叠周期的交集,合并两个相交的周期。

        最后,迭代器 boost::posix_time::time_iterator 迭代时间点。

        示例 36.16。迭代时间点

#include <boost/date_time/local_time/local_time.hpp>
#include <iostream>

using namespace boost::posix_time;
using namespace boost::gregorian;

int main()
{
  ptime pt{date{2014, 5, 12}, time_duration{12, 0, 0}};
  time_iterator it{pt, time_duration{6, 30, 0}};
  std::cout << *++it << '\n';
  std::cout << *++it << '\n';
}

      示例 36.16 使用迭代器 it 从时间 pt 向前跳转 6.5 小时。因为迭代器增加了两次,所以输出是 2014-May-12 18:30:00 和 2014-May-13 01:00:00。


网站公告

今日签到

点亮在社区的每一天
去签到