JS 中的定制日期和时间解决方案

我有一段 lua 代码

<script src="https://github.com/fengari-lua/fengari-web/releases/download/v0.1.0/fengari-web.js"></script>

<div>Ixnay 当地时间为 <span id="IxTime"></span></div>
<script type="application/lua">
local epoch = os.time{year=2014,day=1,month=1}
-- equation: x + y = 2016*365+182; x + z = 2024*365; z = y * 4
-- 这个假定 4 倍速率过去的时间
-- 尝试使用 3 倍速率会导致在时间戳之后无法提供准确的结果

function conv(t)
  local time = os.time(t)
  local seconds_since_epoch = time - epoch
  return seconds_since_epoch * 4 + epoch
end

js.global.document:querySelector("#IxTime").innerHTML = os.date(" %Y-%m-%d %H:%M:%S", conv(os.date('*t', os.time())))

</script>

由于 lua 的限制,Y2k38 问题会在 2038 年之后无法进行计算。我对 javascript 不是很了解,但我知道它拥有更强大的日期/时间机制。我已经试过一些调试,但遇到了两个主要问题:

  1. 我无法弄清楚如何创建更快的时间速率 (时间应该比现实时间大约快 4 倍)

  2. 我似乎无法让时间从我指定的 2014 年 1 月 1 日的纪元时间开始运行

任何帮助都将不胜感激!

点赞
用户1847592
用户1847592

问题在于,在 64 位操作系统下编译的常规 Lua 中不存在问题。但 Fengari 中的整数为 32 位且 os.date() 接受整数时间,因此为了满足 2k38 限制,需要将时间往前推 4 * N 年。

解决方法: 将时间向前推 4 * N 年,以使其在 2038 年之前。

<script src="https://github.com/fengari-lua/fengari-web/releases/download/v0.1.4/fengari-web.js"></script>

<div>The local time in Ixnay: <span id="IxTime"></span></div>

<script type="application/lua">
local epoch = os.time{year=2014,day=1,month=1}

function conv(t)
  local time = os.time(t)
  local seconds_since_epoch = time - epoch
  return seconds_since_epoch * 4.0 + epoch
end

local four_years = os.time{year=2024,day=1,month=1}
                 - os.time{year=2020,day=1,month=1}

local function time_to_string(seconds_since_epoch)
   local k = math.max(0, math.ceil((seconds_since_epoch - math.maxinteger) / four_years))
   local s = seconds_since_epoch - k * four_years
   return os.date(" %%s-%m-%d %H:%M:%S", s):format(tostring(tonumber(os.date("%Y", s)) + 4*k))
end

js.global.document:querySelector("#IxTime").innerHTML = time_to_string(conv(os.date('*t')))

</script>
2020-07-27 21:20:02