Boost-date_time库学习

  最近开了boost库的学习,就先从日期-时间库开始吧,boost的date_time库是一个很强大的时间库,用起来还是挺方便的。

  以下代码只是入门级的简单学习,更详细的资料参考boost源码。

C++ Code


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
 
/************************************************************************/

/* C++ Library                                                        */

/************************************************************************/

#include <iostream>

#include <vector>

/************************************************************************/

/* timer and date_time                                                  */

/************************************************************************/

#include "boost/timer.hpp"

#include "boost/progress.hpp"

#include "boost/date_time/gregorian/gregorian.hpp"

#include "boost/date_time/posix_time/posix_time.hpp"

using namespace boost;

using namespace std;

int main(void)

{

/************************************************************************/

/* timer库                                                              */

/************************************************************************/

// 单位:s

timer tr;

cout << "Max timespan: " << tr.elapsed_max() << endl;

cout << "Min timespan: " << tr.elapsed_min() << endl;

cout << "Now time elapsed: " << tr.elapsed() << endl;

{

cout << "progress_timer start" << endl;

progress_timer p_tr;

//cout << "Now progress_time elapsed: " << p_tr.elapsed() << endl;

cout << "progress_timer end" << endl;

}

vector<int> v;

for (int i = 0; i < 100; i++)

{

v.push_back(i);

}

progress_display p_ds(v.size());

vector<int>::iterator pos;

for(pos = v.begin(); pos != v.end(); pos++)

{

// do something

++p_ds;

}

/************************************************************************/

/* date_time库                                                          */

/************************************************************************/

// date

using namespace boost::gregorian;

// date可通过多种方式来构造,支持加减运算

date dt1;                       //一个无效的日期

date dt2(2017, 6, 1);

date dt3(2017, Jan, 1);

date dt4(dt2);

assert(dt1 == date(not_a_date_time));

assert(dt4 == dt2);

assert(dt3 < dt2);

date dt = from_string("2017-03-15");

date dtt = from_undelimited_string("20170523");

date::ymd_type ymd = dtt.year_month_day();

assert(ymd.year == 2017);

assert(ymd.month == 5);

assert(ymd.day = 23);

cout << dt2.year() << "-"

<< dt2.month() << "-"

<< dt2.day() << endl;

cout << dt.year() << "-"

<< dt.month() << "-"

<< dt.day() << endl;

cout << dtt.year() << "-"

<< dtt.month() << "-"

<< dtt.day() << endl;

cout << dtt << endl;

cout << to_simple_string(dtt) << endl;

cout << to_iso_string(dtt) << endl;

cout << to_iso_extended_string(dtt) << endl;

cout << dtt.day_of_week() << endl;

// 可以使用special_values来创建一些特殊的日期

date d1(pos_infin);

date d2(neg_infin);

date d3(not_a_date_time);

date d4(max_date_time);

date d5(min_date_time);

// 如果创建的日期对象使用了非法值,如超出了范围或使用了不正确的日期,就会抛出异常

try

{

date eDt(1399, 12, 1);

}

catch (...)

{

//...

}

// day_clock

// day_clock是一个天级别的时钟,内部使用了C标准库的localtime()和gmtime()函数;

// 调用静态成员函数local_day()和universal_day()可当天的本地日期和UTC日期对象.

cout << day_clock::local_day() << endl;

cout << day_clock::universal_day() << endl;

// date 与 tm的转换

date date1(2017, 10, 1);

tm t = to_tm(date1);

date date2 = date_from_tm(t);

assert(date2 == date1);

// 日期长度date_duration   以天为单位的时长,有别名days

days dd(10);

// 同时提供了另外三个时长类:years  months weeks

years  y(1);

assert(y.number_of_years() == 1);

months m(2);

assert(m.number_of_months() == 2);

weeks  w(3);

assert(w.days() == 21);

// 日期区间 date_period

date_period dp1(date(2017, 2, 3), days(20));

date_period dp2(date(2017, 5, 1), days(10));

cout << dp1 << endl;

cout << dp2 << endl;

assert(dp1 < dp2);

// time

using namespace boost::posix_time;

// 时间长度 time_duration

time_duration td(1, 10, 20, 1000);              // hour,min,sec,fs

cout << td << endl;

// 时间点 ptime

using namespace boost::gregorian;

ptime pt(date(2017, 6, 10), hours(3));          // 2017年6月10日凌晨3时

ptime pt1 = time_from_string("2017-5-1 10:00:00");

ptime pt2 = from_iso_string("20170501T080000");

ptime pt3 = second_clock::local_time();

ptime pt4 = microsec_clock::universal_time();

cout << pt1 << endl;

cout << pt2 << endl;

cout << pt3 << endl;

cout << pt4 << endl;

cout << to_simple_string(pt) << endl;

cout << to_iso_string(pt) << endl;

cout << to_iso_extended_string(pt) << endl;

// 与tm time_t等结构的转换

tm tt = to_tm(pt);

// 时间时区 time_period

time_period tp(pt, hours(8));                   // 一个8小时的时区

// 除此之外,还有日期、时间迭代器

//date_iterator time_iterator

cout << (gregorian_calendar::is_leap_year(2000) ?  "Yes" : "no") << endl;       // 闰年

assert(gregorian_calendar::end_of_month_day(2013, 2) == 28);                    // 月末天

// 格式化时间

date ddtt(2017, 6, 9);

date_facet *pfacet = new date_facet("%Y年%m月%d日");

cout.imbue(locale(cout.getloc(), pfacet));

cout << ddtt << endl;

cin.get();

return 0;

}

时间: 2024-10-15 22:19:46

Boost-date_time库学习的相关文章

boost库学习之 date_time库

 date_time库是一个全面灵活的日期时间库,提供时间相关的各种所需功能,也是一个比较复杂的库.它支持从1400-01-01到9999-12-31之间的日期计算.使用时包含#include <boost/date_time/gregorian/gregorian.hpp>头文件, 引用boost::gregorian;命名空间. 日期 date是date_time库中的核心类.以天为单位表示时间点. date d1; //无效日期 date d2(2015, 1, 4); date d

boost之date_time库

最近开了boost库的学习,就先从日期时间库开始吧,boost的date_time库是一个很强大的时间库,用起来还是挺方便的.以下算是我学习的笔记,我把它记录下来,以后便于我复习和查阅. #include<iostream>#include<boost/date_time/gregorian/greg_month.hpp>#include<boost/date_time/gregorian/gregorian.hpp> using namespace std;using

c++ boost库学习一:时间和日期

timer类 #include <boost\timer.hpp> #include "iostream" using namespace std; int _tmain(int argc, _TCHAR* argv[]) { boost::timer t; cout<<"max time span: "<<t.elapsed_max()/3600<<"h"<<endl; //596.5

c++ boost库学习三:实用工具

noncopyable 大家都知道定义一个空类的时候,它实际包含了构造函数,拷贝构造函数,赋值操作符和析构函数等. 这样就很容易产生一个问题,就是当用户调用A a(“^_^") 或者A c="^_^" 时会发生一些意想不到的行为,所以很多时候我们需要禁用这样的用法. 一种方法就是把拷贝构造函数和赋值操作符显式的定义为private,但是这样需要很多代码. 于是boost库为大家提供了一个简单的方法:只需要将类继承于noncopyable就可以了. #include "

boost库学习之regex

一.背景 项目中许多地方需要对字符串进行匹配,比如根据指定的过滤字符串来过滤文件名.刚开始是排斥使用boost库的,第一,我不熟悉boost库:第二,如果引入第三方库,就会增加库的依赖,这样的后果是,要么打包程序时,打包动态库,要么直接使用静态库编译,会使增大程序的大小. 刚开始是尝试自己写模糊匹配算法,很简单,就只支持_和%,这两个通配符,然后发现Linux下有一个fnmatch的函数,就是进行模糊匹配的,它支持shell通配符. 但是到最后发现,当需要区别很相似的字符串时,模糊匹配就不行了,

初探boost之timer库学习笔记

timer 用法 #include <boost/timer.hpp> #include <iostream> using namespace std; using namespace boost; int main() { timer t;//声明一个计时器对象,开始计时 cout<<"max:"<<t.elapsed_max()/3600<<"h"<<endl; //可度量的最大时间,以小时

初探boost之progress_display库学习笔记

progress_display 用途 progress_display可以在控制台上显示程序的执行进度,如果程序执行很耗费时间,那么它能提供一个友好的用户界 面,不至于让用户在等待中失去耐心,甚至怀疑程序的运行是否出了问题. 用法示例 #include <boost/progress.hpp> #include <iostream> #include <vector> using namespace std; using namespace boost; int ma

初探boost之smart_ptr库学习笔记

概述 Boost.smart_ptr库提供了六种智能指针,除了shared_ptr 和 weak_ptr 以外还包括 scoped_ptr .scoped_array . shared_array .intrusive_ptr .他们的速度与原始指针相差无几,都是异常安全的,而且对于类型T也仅有一个要 求:类型T的析构函数不能抛出异常. 使用时包含头文件: #include<boost/smart_ptr.hpp> scoped_ptr 用法: scoped_ptr 的构造函数接受一个类型为T

boost库学习之 scoped_ptr scoped_array

boost.smart_ptr库提供了六种智能指针:scoped_ptr.scoped_array.shared_ptr.shared_array.week_ptr和intrusive_ptr. 说到智能指针,我们会想到c++98标准中的自动指针auto_ptr. auto_ptr获取指针所有权后,离开作用域时自动释放该指针指向的堆内存.也可以转移指针的所有权. auto_ptr<A> ap_a1(new A); auto_ptr<A> ap_a2(ap_a1); //发生所有权转

boost库学习之开篇

本系列文章使用boost_1.58.0版本. 一.欢迎使用boost C++库 boost致力于提供一个免费的.便携的源代码级的库. 我们重视那些与C++标准一起工作良好的库.boost库将要成为一个应用广泛的库,成为应用程序可以依赖的平台.boost证书估计商业和非商业机构使用它. 我们的目标是建立已存在的练习而且提供对于库具体实现的引用以至于boost库适合于最后的标准.十个boost库已经包含在C++标准委员会的TR1而且将要被包含在即将到来的C++标准版本中.更多的boost库将目标放在