[Boost]boost的时间和日期处理-(1)日期的操作
<开篇>
Boost.DateTime库提供了时间日期相关的计算、格式化、转换、输入输出等等功能,为C++的编程提供了便利。不过它有如下特点:
1. Boost.DateTime 只支持1400年以后的任何Gregorian日历日期。如果你需要计算再早的日期,则需要寻求其他库来支持。
日期和时间是编程过程中常用的操作。在C标准库中,<time.h>提供了time_t类型、和tm结构类型的时间日期相关函数。Windows API也提供了FILETIME类型的相关函数。由于这里是介绍boost,就不比较这几种之间的优劣了,感兴趣的朋友可以深究一下,相信你会根据自己的需要进行选择。那么,下面我将根据不同情形大概介绍一下Boost.DateTime中的主要功能。如果你需要严格的时间精度计算,请参看Boost.DateTime稳定度和精度的讨论。
*基本概念:
时间点(Time Point)- 某一个时间,例如上午11点钟。
时间段(Time Duration)- 一段时间,不特指起止时间,例如1小时。
时间窗口(Time Interval、Time Period)- 一段时间,从某个时间点到另一时间点,例如下午2点到3点。
时间系统(Time System)- 特定的时间表示、计算规则的体系。
日历系统(Calendar System)- 以一天为基础的时间系统。Gregorian Calender是一个标准的日历系统。
UTC时间(Coordinated Universal Time),支持闰秒的标准时间系统。类似的有格林威治时间GMT。
DST时间(Daylight Savings Time - 夏令时冬令时)很多国家地区在夏天会调整本地时间。
时区(Time Zone) - 使用特定DST规则和与标准时之间时间偏差规则的地区或国家。
Epoch - 日期系统和时钟系统的起点。不同的时间系统起点不一样,通常UTC起点为1970年1月1号0点。
TAI Time - 高精度的时间系统,使用原子时,这个太深奥了,没有具体研究过。
注:下列关于Boost.DateTime输入输出的操作,请参看另一篇介绍:Boost.DateTime的IO操作。
头文件:
#include <boost/date_time/posix_time/posix_time.hpp>
例1. 日期计算:打印今天日期;今年感恩节(11月的第4个星期四)的日期;如果还没有到今年感恩节,打印今天到感恩节还有多少天。
using namespace boost::gregorian;
typedef nth_day_of_the_week_in_month nth_dow;
date today = day_clock::local_day(); //today
std::cout << "today is: " << today << std::endl;
nth_dow fourth_thur_in_nov(nth_dow::fourth,Thursday,Nov); // 4th thursday in Nov
date thanksgiving = fourth_thur_in_nov.get_date(today.year()); // get the date this year
std::cout << "Thanksgiving day this year is: " << thanksgiving << std::endl;
if(today < thanksgiving)
{
date_duration dd = thanksgiving - today; //date duration
std::cout << "has " << dd.days() << " days to thanksgiving."<< std::endl;
}
A. 对于date对象
>> 要获取一个date对象,可以通过date的4种构造函数:
1: date d(2013,Jan,10);//constructor from grep y/m/d
2: date d1(d);//copy constructor
3: /*special date values*/
4: date d2(neg_infin);
5: date d3(pos_infin);
6: date d4(not_a_date_time);
7: date d5(max_date_time);
8: date d6(min_date_time);
9: date d7; //default constructor
>> 也可以通过string字符串获得:
1: using namespace boost::gregorian;
2: date d(from_string("2002/1/25"));
3: date d1(from_string("2002-1-25"));
4: date d2(from_undelimited_string("20020125"));
5:
>> 还可以从时钟获得:
1: using namespace boost::gregorian;
2: date d(day_clock::local_day()); //获取本地日期
3: date d1(day_clock::universal_day());//获取GMT日期
4:
>>要访问date对象,或进行一些日期判断,请参考下面代码:
1: using namespace boost::gregorian;
2: date today = day_clock::local_day();
3: std::cout << today.year() << std::endl; //打印年
4: std::cout << today.month() << std::endl; //打印月
5: std::cout << today.day() << std::endl; //打印日
6: std::cout << today.week_number() << std::endl;//今年的第几周
7: std::cout << today.day_of_week() << std::endl; //打印星期几
8: std::cout << today.day_of_year() << std::endl; //打印一年中的第几天
9: std::cout << today.end_of_month() << std::endl; //打印本月的最后一天是,闰月的2月,可以试试
10: std::cout << today.modjulian_day() << std::endl;
11: std::cout << today.julian_day() << std::endl;
12:
13: if(today.is_infinity())
14: // today.is_neg_infinity();today.is_pos_infinity();today.is_not_a_date();
15: // today.is_special();
16: // today.as_special();
17: {
18: std::cout << "True" << std::endl;
19: }
20: else
21: {
22: std::cout << "False" << std::endl;
23: }
24:
>>我们经常还需要将时间转换为string类型,请参考:
1: using namespace boost::gregorian;
2: date today = day_clock::local_day();
3: std::string str1(to_simple_string(today));//YYYY-MMM-DD, 2013-Jan-11
4: std::string str2(to_iso_string(today));//YYYYMMDD, 20130111
5: std::string str3(to_iso_extended_string(today));//YYYY-MM-DD, 2013-01-11
6: std::cout << str1 << std::endl << str2 << std::endl << str3 << std::endl;
>>date对象还能够和tm互相转换:
1: using namespace boost::gregorian;
2: date today = day_clock::local_day();
3: tm d_tm = to_tm(today); // tm struct, year start from 1900, and Jan is 0, Sunday is 0
4: std::cout << d_tm.tm_year << std::endl << d_tm.tm_mon << std::endl << d_tm.tm_mday << std::endl;
5: std::cout << d_tm.tm_wday << std::endl;
B. 对于date_duration对象
date_duration可以由多种方式构造,操作符+/-可以计算date,date_duration等,具体如下。
1: using namespace boost::gregorian;
2: date leap_year_date(2004,Jan,31);
3: date norm_year_date(2005,Jan,31);
4: date_duration dd(3);
5: days dd1(10);
6: weeks ww(2);
7: months mm(1);
8: years yy(2);
9:
10: std::cout << (leap_year_date + dd) << std::endl;
11: std::cout << (leap_year_date + dd1) << std::endl;
12: std::cout << (leap_year_date + ww) << std::endl;
13: std::cout << (leap_year_date + mm) << std::endl;
14: std::cout << (leap_year_date + yy) << std::endl;
15:
16: std::cout << (norm_year_date + dd) << std::endl;
17: std::cout << (norm_year_date + dd1) << std::endl;
18: std::cout << (norm_year_date + ww) << std::endl;
19: std::cout << (norm_year_date + mm) << std::endl;
20: std::cout << (norm_year_date + yy) << std::endl;
21:
另外,迭代器day_iterator,month_iterator,year_iterator也可以看做定长的date_duration工具,在此不细究。
C. 对于date_period对象
date_peroid作为一个日期窗口,可用于判断一个日期是否落在这个窗口之间。
用两个date或一个date加上一个days可以创建date_period。改变一个date_period可以用平移shift、也可以用加宽expand,可以合并merge,还可以取一个包含这两个period的最小period,方法为span。不过使用的时候大家得注意约束条件,比如merge的时候,两个period应该相交,不然怎么合呢?
1: using namespace boost::gregorian;
2: date d_begin(2013,Jan,22);
3: date d_end(2013,Apr,1);
4: date_period dp(d_begin,d_end);//constructor
5: date_period dp1(d_begin,days(20));//constructor 2
6:
7: std::cout << dp << std::endl;
8: dp.shift(days(10));
9: std::cout << dp << std::endl;
10: dp.expand(days(10));
11: std::cout << dp << std::endl;
到这里,关于boost的date基本方法都有介绍。不过细心的可能发现,11月的第4个星期四问题还没有细说。其实在boost::date_time里面,有多种方法可以得到答案。例子中使用的是nth_day_of_the_week_in_month。大家不妨试试从11月1号开始,用next_weekday找第1个星期四,然后再加3个weeks,之类。
关于时间的处理,和日期非常类似,我也会在续篇中介绍,在此结贴鸟。
<完结>
[Boost]boost的时间和日期处理-(1)日期的操作的更多相关文章
- 《Boost程序库完全开发指南》读书笔记-日期时间
●timer库 #include <boost\timer.hpp> #include <boost\progress.hpp> 1.timer类 // timer类的示例. ...
- [Boost]boost的时间和日期处理-(2)时间的操作
<开篇> 本篇紧接着boost上篇叙述Boost::DateTime的时间处理.在C++中,常见的时间有time_t, FILETIME和tm,而boost中用ptime. 构造ptime ...
- js中的时间转换—毫秒转换成日期时间
转自:http://www.javascript100.com/?p=181 前几天,在项目中遇到js时间增加问题,要将js毫秒时间转换成日期时间 var oldTime = (new Date(&q ...
- my97datepicker开始日期小于结束日期格式化时间精确届时分秒
my97datepicker开始日期小于结束日期格式化时间精确到时分秒 一 , 需求: 结束时间 > 开始时间, 不符合的时间段不能选择.比如我选择开始日期是7月28,那结束的日期将只能从7月2 ...
- js字符串转日期,js字符串解析成日期,js日期解析, Date.parse小时是8点,Date.parse时间多了8小时
js字符串转日期,js字符串解析成日期,js日期解析, Date.parse小时是8点,Date.parse时间多了8小时 >>>>>>>>>&g ...
- JS 格式化时间(获取两个日期之间的每一天、每一月、每半小时、每一秒)
时间戳转换为时间 // 时间戳转换为时间 function timestampToTime(timestamp, isMs = true) { const date = new Date(timest ...
- boost boost::asio::read socket.read_some 区别
boost boost::asio::read 尝试读一定数量的字节,直到读到为止,或者出错 socket.read_some 读一下socket,读到多少算多少 带async的类似
- 【C#】datetimepicker里面如何设置日期为当天日期,而时间设为0:00或23:59?
今天无意中发现要根据日期查询时间,datatimepicker控件会把时间默认成当前时间(当你的控件只显示日期时),这样查询出来的出来的数据会有误差,用来下面的办法成功设置日期为当天日期,而时间设为0 ...
- 获取类似QQ似的时间,昨天或具体日期
最近在做一个聊天功能,并且要在用户列表上显示最后聊天时间,类似QQ的日期显示. 问群里和百度后,群里没人鸟我,网上也没搜到,最后苦于无奈只能自己封装了. 不过话说回来了,大哥与小弟的区别就是大哥写好封 ...
随机推荐
- Flash Builder常用快捷键
红色为常用 Ctrl-Shift-O - Organize imports,去除无用的导入类 Ctrl+F11 - 运行(在浏览器浏览) F11 - 调试 Alt+/ - 内容辅助 Ctrl+Alt+ ...
- nvl与 is not null的区别等
Oracle中: Select Aae140 From Ab07 Where Aab001 = Pi_Aab001 And Aae002 = Pi_Aae002 ) 1 nvl(aaz288,0)&g ...
- ThinkPHP 常用配置项列表
//数据库配置 DB_HOST 主机名 DB_USER 用户名 DB_PWD 密码 DB_NAME 数据库名 DB_PREFIX 表前缀 LOAD_EXT_FILE=>'function lis ...
- centos主机建立ssh互信
ssh-keygen 生成密钥 1.ssh-keygen -t rsa 可以加密和签名 rsa 只能加密不能签名 2.ssh-copy-id -i /root/.ssh/id_rsa.pub USER ...
- 网站压力测试之ApacheBench
ApacheBench是 Apache 附带的一个小工具,专门用于 HTTP Server 的benchmark testing,可以同时模拟多个并发请求.使用yum安装apache,ab工具在/us ...
- PHP学习笔记14-操作session
PHP会话管理图: 创建index: <?php /** * Created by PhpStorm. * User: Administrator * Date: 2015/7/2 * Time ...
- tf–idf算法解释及其python代码实现(下)
tf–idf算法python代码实现 这是我写的一个tf-idf的简单实现的代码,我们知道tfidf=tf*idf,所以可以分别计算tf和idf值在相乘,首先我们创建一个简单的语料库,作为例子,只有四 ...
- 转: ajax跨域之JSONP
事件背景: 某个站点分为静态产品介绍页面(或由于某原因需要静态化),和一个独立的在线应用程序.静态产品页面属于www.a.com下,而在线应用程序作为一个相对独立的系统存在于app.a.com上. 在 ...
- QStringLiteral(源代码里有一个通过构造函数产生的从const char*到QString的隐式转换,QStringLiteral字符串可以放在代码的任何地方,编译期直接生成utf16字符串,速度很快,体积变大)
原作者: Olivier Goffart 点击打开链接http://woboq.com/blog/qstringliteral.html 译者: zzjin 点击打开链接http://www.tuic ...
- js 选择器
a>b 获取a下面的直接子元素