日期和时间处理

简介: 日期和时间处理

当函数 os.date 创建日期时间表时,该表的所有字段均在有效的范围内。当我们给函数 os.time 传入一个日期表时,其中的字段并不需要归一化。这个特性对于日期和时间的处理非常重要。


举一个简单的例子,假设想知道从当前向后数 40 天的日期,那么可以使用如下的代码进行计算:

t = os.date("*t")                           -- 获取当前时间
print(os.date("%Y/%m/%d", os.time(t)))      -- 2022/03/18
t.day = t.day + 40
print(os.date("%Y/%m/%d", os.time(t)))      -- 2022/04/27


如果我们把数字表示的时间转换成日期表,那么就能得到日期和时间的归一化形式:

t = os.date("*t")  
print(t.day, t.month)                       -- 18      3
t.day = t.day - 40
print(t.day, t.month)                       -- -22     3
t = os.date("*t", os.time(t))
print(t.day, t.month)                       -- 6       2


在大多数系统中,也可以对数字形式的时间增加或减少 345600040 天对应的秒数)。不过,由于标准C并不要求数值表示的时间是从纪元开始的,因此标准C并不保证这种操作的正确性。此外,如果我们想增加的是月份而非天数,由于不同的月份具有不同的天数,那么直接操作秒数就会有问题。而以归一化的方式处理则没有这些问题。

t = os.date("*t")
print(os.date("%Y/%m/%d", os.time(t)))      -- 2022/03/18
t.month = t.month + 6
print(os.date("%Y/%m/%d", os.time(t)))      -- 2022/039/18


在操作日期时,我们必须要小心。虽然归一化是以显而易见的方式进行,但是也可能会有一些不明显的后果。例如,如果计算 March 31 之后的一个月,将会得到 April 31 ,而实际上应该被归一化成 May 1April 30 之后的一天)。尽管这听上去很自然,但实际上如果从结果( May 1 )中减去一个月,得到的却是 April 1 而不是原来的 March 31


提示

这种不一致是日历机制导致的结果,与 Lua 语言无关。


os.difftime

函数 os.difftime 用来计算两个时间之间的差值,该函数以为单位返回两个指定数字形式表示的时间的差值。对于大多数系统而言,这个差值就是一个时间相对于另一个时间的减法结果。但是,与减法不同,函数 os.difftime 的行为在任何系统中都是确定的。以下示例计算了 Lua5.2Lua5.3 发布时间之间间隔的天数:

local t5_3 = os.time({year = 2015, month = 1, day = 12})
local t5_2 = os.time({year = 2011, month = 12, day = 16})
local d = os.difftime(t5_3, t5_2)
print(d // (24 * 3600))             --> 1123


使用函数 difftime 可以获取指定日期相对任意时刻的秒数:

> myepoch = os.time{year = 2000, month = 1, day = 1, hour = 0}
> now = os.time{year = 2014, month = 11, day = 20}
> os.difftime(now, myepoch)                                         --> 501336000.0点击复制复制失败已复制


通过归一化,可以很容易地将用秒表示的时间转换为合法的数字形式表示的时间,即我们可以创建一个带有开始时刻的日期表并将日期表中的秒数设置为想要转换的数字,例如:

> T = {year = 2000, month = 1, day = 1, hour = 0}
> T.sec = 501336000
> os.date("%d/%m/%Y", os.time(T))                       --> 20/11/2015点击复制复制失败已复制


os.clock

我们还可以使用函数 os.difftime 来计算一段代码的执行时间。不过,对于这个需求,更好的方式是使用函数 os.clock ,该函数会返回程序消耗的 CPU 时间(单位是)。函数 os.clock 在性能测试中的典型用法形如:

local x = os.clock()
local s = 0
for i = 1, 100000 do s = s + 1 end
print(string.format("elapsed time: %.2f\n", os.clock() -x))


与函数 os.time 不同,函数 os.clock 通常具有比秒更高的精度,因此其返回值为一个浮点数。具体的精度与平台相关,在 POSIX 系统中通常是1毫秒

目录
相关文章
|
7月前
|
存储 C语言 C++
c++日期和时间
c++日期和时间
45 0
|
2月前
时间处理
时间处理
25 3
|
7月前
|
C语言 C++
c++日期&时间
c++日期&时间
57 1
|
6月前
一文搞懂:两个日期的时间间隔
一文搞懂:两个日期的时间间隔
64 0
|
7月前
|
弹性计算 运维 Shell
解析日期和时间
【4月更文挑战第29天】
48 1
|
小程序 JavaScript API
小程序获取当前日期和时间点的方法
小程序获取当前日期和时间点的方法
201 0
|
存储 Java 程序员
实战:求年月日时间前后遇到的坑和解决方式
这周接到一个时间转换任务需要处理,本来没什么问题,后来完成后发现时间有偏差,又重写了一遍代码,感觉很有记录必要性,希望看过的小伙伴可以避坑。
实战:求年月日时间前后遇到的坑和解决方式
|
存储 算法 Unix
C++ 日期和时间编程总结
在 C++11 之前,C++ 编程只能使用 C-style 日期时间库,其精度只有秒级别,这对于有高精度要求的程序来说,是不够的。但这个问题在C++11 中得到了解决,C++11 中不仅扩展了对于精度的要求,也为不同系统的时间要求提供了支持。另一方面,对于只能使用 C-style 日期时间库的程序来说,C++17 中也增加了 timespec 将精度提升到了纳秒级别。
374 1
|
存储 Linux 编译器
C++ 日期和时间的相关函数
C++ 日期和时间的相关函数
299 0