13.6 存储和使用日期和时间
wxWidgets 提供了一个功能强大的类 wxDateTime 来进行时间和日期相关的操作,包括:格式化输出,时区,时间和日期计算等等.还提供了一些静态函数来提供当前的日期和时间以及查询某个给定的年份是不是闰年等.注意即使你只想操作日期或者是时间,你仍然可以使用 wxDateTime 类型. wxTimeSpan 和 wxDateSpan 类型提供了修改一个 wxDateTime 值的合适的方法。
wxDateTime
wxDateTime 类拥有很多的成员函数,每个函数的含义都很清晰.完整的 API 可以参考 wxWidgets 的相关手册,下面只对其中使用最频繁的函数进行一些介绍。
注意尽管时间在其内部总是以格林威治时间(GMT) 存储的,但是你通常关心的是本地时区的时间而不是格林威治时间,因此, wxDateTime 的构造函数以及更改函数中各个组成时间的要素(比如小时,分钟和秒钟) 等都指的是本地时区的时间.所有用于获取时间和日期的函数返回的要素(月,日,小时,分,秒等) 也都是本地时间.因此,如果这是你需要的,你不需要作任何额外的操作,如果你希望操作不同时区的时间,请参考相关的文档。
wxDateTime 类的构造和更改
wxDateTime 可以通过 Unix 时间戳,仅包含时间的信息,仅包含日期的信息,完整的时间日期信息等途径创建.对于每一个构造函数,都有一个对应的 Set 函数用来更改已经设置了值的 wxDateTime 对象.也可以通过类似 SetMonth 或者 SetHour 等函数更改时间或者日期中的某个要素。
wxDateTime(time_t) 函数根据一个指定的 Unix 时间戳来构造对象。
wxDateTime(const struct tm&) 函数根据一个指定的 C 语言标准 tm 结构构造对象。
wxDateTime(wxDateTime_t hour, wxDateTime_t minute = 0, wxDateTime_t second = 0, wxDateTime_t millisec = 0) 根据指定的时间要素构造对象。
wxDateTime(wxDateTime_t day, Month month = Inv_Month, int year = Inv_Year, wxDateTime_t hour = 0, wxDateTime_t minute = 0, wxDateTime_t second = 0, wxDateTime_t millisec = 0) 根据指定的时间和日期要素构造对象
wxDateTime 访问方法
大多数 wxDateTime 类的访问函数都是自解释的,比如: GetYear, GetMonth, Getday, GetWeekDay, GetHour, GetMinute, GetSecond, GetMillisecond, GeTDayOfYear, GetWeekOfYear, GetWeekOfMonth 和 GetYearDay 等. wxDateTime 还提供了下列一些访问函数:
- GetTicks 返回一个 Unix 时间戳(也就是自从 1970 年 1 月 1 日午夜以来的秒数)。
- IsValid 返回时间日期类是不是已经被初始化(类自使用默认构造函数创建以后始终未被赋值)。
获取当前时间
wxDateTime 提供了两个静态函数返回当前时间:
- wxDateTime::Now 返回精度为秒的当前时间。
- wxDateTime::UNow 返回精度为毫秒的当前时间。
时间和字符串的转换
下面介绍的这些函数用来实现时间和字符串的相互转换.将时间转化成字符串的方法是比较简单的:你可以将时间转换成本地格式的字符串 (FormatDate 和 FormatTime 函数),或者以定义在 ISO 8601 中的国际标准格式来显示(FormatISODate 函数和 FormatISOTime 函数),也可以以自定义的格式来显示(Format 函数)。
而从文本到时间的转换则显得更复杂些,因为可能的时间格式太多了.最简单的函数是 ParseFormat 函数,它用来解析那些指定格式的时间文本.ParseRfc822Date 函数用来解析那些定义在 RFC822 中的时间表示方法,这种方法在 email 或者互联网上使用比较普遍。
最有趣的文本到时间转换函数是 ParseTime,ParseDate 和 ParseDateTime 函数,它们将尽量匹配各种格式的时间文本.除了预定义的那些标准格式以外,ParseDateTime 函数甚至可以支持那些类似"tomorrow"(明天), "March first"(三月一日) 以及"next Sunday"(下个星期天) 这样的时间。
日期比较
两个 wxDateTime 对象可以通过各种函数进行比较,这些函数都返回 bool 类型的值.这些函数包括:IsEqualTo, IsEarlierThan, IsLaterThan, IsSameDate 和 IsSameTime 等。
而 IsStrictlyBetween 和 IsBetween 则用来比较某个日期是不是在两个日期之间.这两个函数的区别在于,如果要比较的时间刚好等于其中的与其比较的边界值的时候,前者返回 False 而后者返回 True。
日期计算
wxWidgets 提供了两个非常灵活的类 wxTimeSpan 和 wxDateSpan 来辅助进行日期和时间的计算. wxTimeSpan 用来计算那些以毫秒为单位的,跨度不大的,快速的和精确的计算,而 wxDateSpan 则用来进行跨度比较大的比如几周或者几个月的计算.wxDateSpan 将尽可能使用更自然的方法来进行计算,因此其含义有时候并不象它看上去的那样精确.比如 1 月 31 日加上一个月将返回二月 28 日 (或 29 日),也就是说是二月的最后一天,而不是永远不可能存在的二月 31 日.通常,你比较喜欢这样的结果,不过有时候相应的减法运算可能也会把你搞糊涂,比如二月 28 日减去一个月的结果的一月 28 日而不是一月 31 日。
日期类型可以进行的操作很多,但是这些操作的组合却未必是有效的.比如:对一个日期进行乘法运算是无效的,而对于任何一个表示时间间隔的类(wxTimeSpan 或 wxDateSpan) 进行乘法运算则没有任何问题。
- 加法: wxTimeSpan 或 wxDateSpan 可以和 wxDateTime 进行加法运算,返回一个新的 wxDateTime 对象. 两个相同类型的时间间隔类也可以进行加法运算,返回一个新的同样类型的对象。
- 减法: 减法适用和加法同样的规则,额外的一个规则是两个 wxDateTime 对象相减返回一个 wxTimeSpan 对象。
- 乘法: wxTimeSpan 或 wxDateSpan 对象可以乘以一个整数,返回一个同样类型的对象。
- Unary 相减:wxTimeSpan 或 wxDateSpan 对象可以定义为负数,导致相反的时间方向上的同样的间隔。
下面的例子演示了 wxDateSpan 和 wxTimeSpan 的用法,更多的用法请参考 wxWidgets 的相关手册。
void TimeTests()
{
// 获取当前时间和日期
wxDateTime DT1 = wxDateTime::Now();
// 创建一个 2 星期零 1 天,或者说 15 天的间隔
wxDateSpan Span1(0, 0, 2, 1);
// 今天减去 15 天
wxDateTime DT2 = DT1 - Span1;
// 用静态方法创建一天的间隔
wxDateSpan Span2 = wxDateSpan::Day();
// Span3 将代表 14 天的间隔
wxDateSpan Span3 = Span1 - Span2;
// 0 天 (这个间隔将用 2 周来表示)
int Days = Span3.GetDays();
// 14 天 (2 周)
int TotalDays = Span3.GetTotalDays();
// 之前两周
wxDateSpan Span4 = -Span3;
// 3 个月的间隔
wxDateSpan Span5 = wxDateSpan::Month() * 3;
// 10 小时 5 分 6 秒的间隔
wxTimeSpan Span6(10, 5, 6, 0);
// DT2 增加固定的间隔 Span6
wxDateTime DT3 = DT2 + Span6;
// Span7 是相反方向上的 3 倍 Span6 的间隔.
wxTimeSpan Span7 = (-Span6) * 3;
// SpanNeg 将返回 True, 这个间隔是负方向的.
bool SpanNeg = Span7.IsNegative();
// 适用静态方法创建一个 1 小时的间隔
wxTimeSpan Span8 = wxTimeSpan::Hour();
// 1 小时当然小于 30 小时(这里使用绝对值)
bool Longer = Span8.IsLongerThan(Span7);
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论