【wxWidgets 教程】工具类篇:日期和时间(九)

参考文档:
https://docs.wxwidgets.org/latest/overview_datetime.html

一、介绍

wxWidgets 提供了一套强大的日期和时间处理类。

好了,介绍完毕~~

二、wxDateTime 核心特性

1. 时间的呈现:

  • 使用 wxDateTime,时间是以从1970年1月1日开始的毫秒数来呈现的。不过,我们不需要太关心这个起始点——无论是纪元前还是纪元后的日期,处理方式都是一样的。
  • 它能精确到1毫秒,这是它的最小时间单位。

2. 对象细节:

  • 一个 wxDateTime 对象占用的空间是 8 字节,因为它采用了 64 位整数进行表示。
  • 因此,它能涵盖的时间范围大概有 5.8 亿年。但目前,由于日历的某些规则,它只能处理从公元前4714年11月24日开始的日期(不过,这个起点有可能根据需求变化)。

3. 与时区的关系:

  • wxDateTime 内部,时间总是以格林威治时间(GMT)来表示的,与时区无关。但当我们想要获取日期的某些部分,如“年、月、日”时,时区就显得很重要了。有关时区的详细信息,可参考“时区相关内容”部分。

4. 日历选择:

  • 现在,wxDateTime 主要使用的是格里高利历。这个日历其实在1582年10月15日才被大规模采用,而具体的采纳时间在各国或地区还有差异。
  • 虽然目前主要是格里高利历,但未来版本很可能增加儒略历的支持。至于其他如玛雅、希伯来、农历等日历,也在考虑中(到目前为止,没农历是最扎心的事情)。

三、wxDateSpan 和 wxTimeSpan

1. 基本点:

  • 想象一下,记录一个特定的时间(比如你的生日)只有一种方式,这就是 wxDateTime 类。
  • 但描述两个时间之间的差距有多种方法

2. wxTimeSpan:

  • 这就像用秒、分钟、小时来描述时间差。比如,“3小时15分钟后”这种方式。
  • 使用这种方法计算时间很直接,也很(效率很高,有多高我不清楚,反正就是高)。

3. 日常描述时间差:

  • 有时我们说“一个月后”或“两天后”。但“一个月”具体有多少天?这就复杂了,特别是考虑到有的月份是30天,有的是31天2月还可能是28或29天

4. wxDateSpan:

  • 这个类就是为了帮助我们处理像“一个月后”这样的时间描述。
  • 但有时会有点麻烦,比如从1月31日算起“一个月后”是2月的最后一天,不是2月31日(因为2月没有31日)。再反过来算,2月的最后一天往前“推一个月”,可能就不是1月31日了。

5. 哪个好用?:

  • 如果你只想简单地描述时间差,比如几个小时、几分钟,那就用 wxTimeSpan
  • 但如果你需要处理像“一个月”、“两年”这样的描述,wxDateSpan 会更有帮助,只是有时需要小心使用

简单说,wxTimeSpan 是用来计算具体的时间差,而 wxDateSpan 是用来处理我们日常说的“几天后”、“几个月后”这样的时间描述。

四、日期计算(wxDateTime)

日期和时间跨度(就是某段时间的长度)可以进行各种计算,但要小心,因为不是所有的计算都合理。想象一下,我们不能把一个具体的日期(比如3月15日)乘以2,这没有意义。但我们可以把10天乘以2,得到20天。

下面是可以做的计算:

1. 加法:

  • 可以把时间跨度加到具体日期上,比如“3月15日加10天”。
  • 也可以把两个时间跨度加在一起,比如“10天加5天”。

2. 减法:

  • 除了上面的加法类似操作,我们还可以计算两个日期之间的时间差,比如“3月20日减3月15日”得到5天。

3. 乘法:

  • 时间跨度可以乘以一个数字,比如“10天乘以2”就是20天。

4. 取反:

  • 对于时间跨度,可以取反。这就像说,如果原来是“向前10天”,取反后就是“向后10天”。

为了方便操作,这些计算都有对应的工具和函数,比如加法(Add())、减法(Subtract())和乘法(Multiply()),不过一元负号以及复合赋值操作(如 +=)只作为成员实现。而取反的函数叫做Neg()

简单来说,这些工具和函数让我们更容易地计算和调整日期和时间。

五、时区相关内容

尽管时间在内部总是以格林威治标准时间(GMT)存储,但通常我们都在当地时区工作。这意味着,当我们创建或设置日期和时间时,默认都是基于当地的时区。例如,创建日期"1970年1月1日",这个日期不是 GMT 的起点,除非你正好住在英国。同样地,获取时间组件(如年、月、日、小时等)时,默认都是基于当地时区

对于大部分小伙伴来说,只需要知道这些就足够了。但如果想处理不同的时区,还有一些内容要注意:

  1. 创建时区:虽然创建日期和时间时默认是当地时区,但有时我们可能想要表示其他时区的时间。这时,需要使用工具函数来调整,如 ToTimezoneMakeTimezone。对于常见的 UTC 时区,也有专门的函数,如 ToUTCMakeUTC
  2. 获取其他时区的时间:不必先转换对象就可以直接获取其他时区的时间。只需给受时区影响的函数传递一个时区参数即可。例如,Format() 函数就可以接受一个时区参数,允许我们方便地显示任意时区的时间。
  3. 如何构建时区对象:虽然可以手动构建时区,指定与 GMT 的时间差,但通常我们可以使用预定义的时间和日期函数来自动完成。

简单示例:

wxDateTime dt(...whatever...);
wxPrintf("本地时区的时间是 %s", dt.FormatTime());
wxPrintf("GMT的时间是 %s", dt.FormatTime(wxDateTime::GMT));

这个示例说明了如何展示本地时区的时间和 GMT 时区的时间。

六、夏令时

跳过,我没用过这玩意儿,官方解释我也看不懂,没法总结。。

官方解释我贴出来,哪位小伙伴有需求就自己看看吧:

DST (a.k.a. ‘summer time’) handling is always a delicate task which is better left to the operating system which is supposed to be configured by the administrator to behave correctly. Unfortunately, when doing calculations with date outside of the range supported by the standard library, we are forced to deal with these issues ourselves.

Several functions are provided to calculate the beginning and end of DST in the given year and to determine whether it is in effect at the given moment or not, but they should not be considered as absolutely correct because, first of all, they only work more or less correctly for only a handful of countries (any information about other ones appreciated!) and even for them the rules may perfectly well change in the future.

The time zone handling methods (see Time Zone Considerations) use these functions too, so they are subject to the same limitations.

七、兼容性

在 wxWidgets 的早期版本 1.xx 中,日期和时间的处理是通过 wxDatewxTime 类来完成的。这两个类是早期版本中的旧工具,现已被 wxDateTime 所取代,建议大家使用更新的 wxDateTime 类,因为它更为强大、一致,并且没有早期版本的那些问题限制(不与"Y2K"兼容)。

八、总结

wxDateTime 是 wxWidgets 中主要的日期和时间处理类。它为日期和时间的各种操作提供了一套强大的工具,包括日期运算、时间区间和时间区操作。

(一) wxDateTime的核心特性:

  1. 广泛的范围: 支持的日期范围从大约 4714 B.C. 到大约 4.8 亿年后
  2. 高精度: 避免使用浮点运算,确保日期计算不受四舍五入误差的影响
  3. 丰富的功能: 不仅支持常规的日期操作,还支持如周和年中的日期计算、工作日测试、标准天文函数以及日期与字符串之间的转换。
  4. 效率: wxDateTime 对象的大小只有 8 字节,并且操作速度快。

(二) 关联类和功能:

  • **wxTimeSpan****wxDateSpan**: 这两个类代表时间间隔,其中 wxTimeSpan 是一个具体的、自解释的方式来表示时间间隔,而 wxDateSpan 是一个与日历相关的时间间隔表示。
  • 节假日处理: wxDateTimeHolidayAuthoritywxDateTimeWorkDays 这两个辅助类用于确定某个日期是否为节假日。
  • 时间区操作: 尽管 wxDateTime 内部总是以 GMT 存储时间,但它提供了多种函数来处理和转换不同的时区。
  • 夏令时(DST)处理: wxWidgets 提供了一系列的函数来处理夏令时的开始、结束以及当前是否处于夏令时(我猜的,这一点大家不用在意,因为我也没搞懂)。

(三) 关于旧日期/时间类:

在 wxWidgets 的早期版本 1.xx 中,日期和时间的处理是通过 wxDatewxTime 类来完成的。这两个类是早期版本中的旧工具,现已被 wxDateTime 所取代。


【wxWidgets 教程】工具类篇:日期和时间(九) 至此完毕,欢迎大家指正!还请大家点点赞,给我点动力~~

上一篇:【wxWidgets 教程】工具类篇:容器(八)
下一篇:【wxWidgets 教程】工具类篇:文件处理(十)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xiao_Ley

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值