• 友链

  • 首页

  • 文章归档
h u a n b l o g
h u a n b l o g

欢

HI,Friend

04月
20
Lua

Lua中日期和时间

发表于 2022-04-20 • 字数统计 3999 • 被 865 人看爆

概述

Lua语言对日期和时间有两种表示方式:
第1种表示方式是一个数字,这个数字通常是一个整型数。
第2种表示方式是一个表-日期表

  日期表具有以下几个重要的字段: year、month、day、hour、 min、sec、wday、yday和isdst,除isdst以外的所有字段均为整型数。

  • 前6个字段的含义非常明显,
  • wday字段表示本周中的第几天(第1天为星期天);
  • yday字段表示当年中的第几天(第1天是1月1日);
  • isdst字段表示布尔类型,如果使用夏时令则为真。

例如,Sep 16, 1998,23:48:10((星期三)对应的表是:

{year = 1998,month = 9, day = 16,yday = 259, wday = 4,hour = 23,min = 48,sec = 10, isdst = false}

函数os.time

不带任何参数调用函数os.time,会以数字形式返回当前的日期和时间
os.time()       -->1650444929   时间戳  

local date = 1650444929
local dayYear = 365                 -- 1年天数
local secHour = 60 * 60             -- 1小时的秒数
local secDay = secHour * 24         -- 1天的秒数
local secYear = secDay * dayYear    -- 1年的秒数

--年
print(date // secYear + 1970)       

-- 小时(UTC格式)
print(date % secDay // secHour)    

--分钟
print(date % secHour // 60)

--秒
print(date % 60)

  如果以一个日期表作为参数调用函数os.time,那么该函数会返回该表中所描述日期和时间对应的数字。year 、month和day字段是必需的,hour、 min和sec字段如果没有提供的话则默认为12:00:00,其余字段(包括wday和yday)则会被忽略。

os.time({year=2015, month=8, day=15, hour=12, min=45, sec=20})         --> 1439653520
os.time({year=1970, month=1, day=1, hour=})                            --> 10800
os.time({year=1970, month=1, day=1, hour=0, sec=1})                    --> 10801 
os.time(iyear=1970, month=1, day=1})                                   --> 54000     

请注意,10800是3个小时的秒数,54000则是10800加上12个小时的秒数。

函数os.date

函数os.date在一定程度上是函数os.time的反函数(尽管这个函数的名字写的是date),它可以将一个表示日期和时间的数字转换为某些高级的表示形式,要么是日期表要么是字符串。该函数的第1个参数是描述期望表示形式的格式化字符串,第2个参数是数字形式的日期和时间(如果不提供,则默认为当前日期和时间)。

要生成一个日期表,可以使用格式化字符串"*t"。例如,调用函数os.date("*t",906000490)会返回下列表:

对于任何有效的时间t, os.time(os.date("*t",t))==t均成立。

字段描述
year一整年
month1 ~ 12
day1 ~ 31
hour0 ~ 23
min0 ~ 59
sec0 ~ 60
wday1 ~ 7
yday1 ~ 366

秒的最大范围是60,允许闰秒的存在。

  对于其他格式化字符串,函数os.date会将日期格式化为一个字符串,该字符串是根据指定的时间和日期信息对特定的指示符进行了替换的结果。所有的指示符都以百分号开头紧跟一个字母

例如:

print(os.date("a %A in %B"))                --> a Wednesday in April
print(os.date("%d/%m/%Y",906000490))      -->16/09/1998

所有的表现形式取决于当前的区域设置。

指示符描述
%a星期几的简写(例如,Wed)
%A星期几的全名(例如,Wednesday)
%b月份的简写(例如,Sep)
%B月份的全名(例如,September)
%c日期和时间(例如,09/16/98 23:48:10)
%d一个月中的第几天(16)[01-31]
%H24小时制中的小时数(23) [00-23]
%I12小时制中的小时数(11)[01-12]
%j一年中的第几天(259)[001-365]
%m月份(09)[01-12]
%M分钟(48)[00-59]
%p"am”或"pm" (pm)
%S秒数(10)[00-60]
%w星期(3)[0-6 = Sunday-Saturday]
%W一年中的第几周(37)[00-53]
%x日期(例如,09/16/98)
%X时间(例如,23:48:10)
%y两位数的年份(98)[00-99]
%Y完整的年份(1998)
%z时区(例如,-0300)
%%百分号
t = 906000490
-- ISO 8601格式的日期
print(os.date( "%Y-%m-%d", t))           --> 1998-09-16
-- IS0 8601格式的日期和时间
print(os.date("%Y-%m-%d T%H:%M:%S", t))  --> 1998-09-16T23:48:10
-- IS0 8601格式的序数日期
print(os.date( "%Y-%j", t))              --> 1998-259

如果不带任何参数调用函数os.date,那么该函数会使用格式%c。如果需要诸如dd/mm/yyyy这样的固定表示形式,那么就必须显式地使用诸如"%d /%m/%Y”这样的格式化字符串。

日期和时间处理

t = os.date("*t")                         -- 获取当前时间
print(os.date("%Y/%m/%d", os.time(t)))    --> 2022/04/20
t.day = t.day + 40                        -- 获取40天后
print(os.date("%Y/%m/%d", os.time(t)))    --> 2022/05/30

--将日期时间归一化
t = os.date("*t")
print(t.day,t.month)                       --> 20	4
t.day = t.day - 40
print(t.day, t.month)                      --> -20	4
t = os.date("*t", os.time(t))
print(t.day, t.month)                      --> 11	3

函数difftime用来计算两个时间之间的差值,该函数以秒为单位返回两个指定数字形式表示的时间的差值。

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.0
分享到:
Lua位和字节
Lua字符匹配
  • 文章目录
  • 站点概览
欢

网红 欢

你能抓到我么?

Email RSS
看爆 Top5
  • mac系统版本与Xcode版本有冲突 4,080次看爆
  • JAVA_HOME环境配置问题 3,731次看爆
  • AssetBundle使用 3,499次看爆
  • VSCode配置C++开发环境 3,257次看爆
  • Lua反射 3,133次看爆

Copyright © 2025 欢 粤ICP备2020105803号-1

由 Halo 强力驱动 · Theme by Sagiri · 站点地图