在Lua中比较日期
2015-2-16 21:10:38
收藏:0
阅读:206
评论:3
我有一个包含日期表的变量,看起来像这样:
* 表格:
[日]
* 数字:15
[年份]
* 数字:2015
[月份]
* 数字:2
如何获取当前日期与上面日期之间的天数?非常感谢!
点赞
用户365496
你可以使用这里收集的算法:
chrono-Compatible Low-Level Date Algorithms
这些算法使用 C++ 显示,但是如果需要,你可以轻易地在 Lua 中实现它们,或者你可以在 C 或 C++ 中实现它们,然后仅提供 Lua 绑定。
使用这些算法的基本思路是为两个日期计算一个天数,然后将它们相减以得出天数。
--[[
http://howardhinnant.github.io/date_algorithms.html
返回自公元 1970 年 1 月 1 日以来的天数。负值表示 1970 年 1 月 1 日之前的天数。
前提条件:y-m-d 表示公民(格里高利)日历中的日期
m 在 [1, 12] 范围内
d 在 [1, last_day_of_month(y, m)] 范围内
y 大约在 [numeric_limits<Int> :: min() / 366,numeric_limits<Int> :: max() / 366] 范围内
有效范围的精确范围为:
[civil_from_days(numeric_limits<Int>::min()),
civil_from_days(numeric_limits<Int>::max()-719468)]
]]
function days_from_civil(y, m, d)
if m <= 2 then
y = y - 1
m = m + 9
else
m = m - 3
end
local era = math.floor(y/400)
local yoe = y - era * 400 -- [0, 399]
local doy = math.modf((153*m + 2)/5) + d-1 -- [0, 365]
local doe = yoe * 365 + math.modf(yoe/4) - math.modf(yoe/100) + doy -- [0, 146096]
return era * 146097 + doe - 719468
end
local reference_date = {year=2001, month = 1, day = 1}
local date = os.date("*t")
local reference_days = days_from_civil(reference_date.year, reference_date.month, reference_date.day)
local days = days_from_civil(date.year, date.month, date.day)
print(string.format("今天是 21 世纪的第 %d 天.",days-reference_days))
2015-02-16 23:53:09
用户3735873
os.time(至少在 Windows 下)仅限于 1970 年及以后的年份。例如,如果你需要一个通用的解决方案来查找出生于 1970 年之前的人的天龄,那么这将无法运行。你可以使用儒略日转换,并在两个数字之间做减法(今天的日期和目标日期)。
以下给出了一个示例儒略日功能,可适用于任何公元日期(使用 Lua v5.3,因为涉及到“//”,但你也可以适应早期版本):
local
function div(n,d)
local a, b = 1, 1
if n < 0 then a = -1 end
if d < 0 then b = -1 end
return a * b * (math.abs(n) // math.abs(d))
end
--------------------------------------------------------------------------------
-- 将 YYMMDD 日期转换为自 1900 年 1 月 1 日以来的儒略日(可能为负数)
--------------------------------------------------------------------------------
function julian(year, month, day)
local temp
if (year < 0) or (month < 1) or (month > 12)
or (day < 1) or (day > 31) then
return
end
temp = div(month - 14, 12)
return (
day - 32075 +
div(1461 * (year + 4800 + temp), 4) +
div(367 * (month - 2 - temp * 12), 12) -
div(3 * div(year + 4900 + temp, 100), 4)
) - 2415021
end
2015-02-17 00:50:42
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
你可以使用
os.time()方法将你的表格转换为秒,并获得当前时间,然后使用os.difftime()方法来计算时间差。参见 Lua Wiki 获取更多详情。reference = os.time{day=15, year=2015, month=2} daysfrom = os.difftime(os.time(), reference) / (24 * 60 * 60) -- 一天中的秒数 wholedays = math.floor(daysfrom) print(wholedays) -- 今天将打印 "1"正如 @barnes53 指出的,可能会存在几秒钟的时间差,因此不是最理想的方法,但它可能已经足够满足你的需求。