从os.date()中减去小时数

我目前有这段代码

local day = os.date('%A')
local timesubtract = 8 --GMT -8 小时
local hour = os.date('%H')
local newtime = (day-timesubtract)

显然它不起作用。我已经在论坛上翻了3-4个小时的帖子,但没有找到解决方法

基本上,我需要调用特定时区的星期几。例如,今天是星期六,但在世界上的其他地方可能仍然是星期五,如果在“timesubtract”中设置了偏移量,它将为该时区调用正确的星期几。

点赞
用户2546626
用户2546626

你可以使用 os.time 函数来获得时间的秒数(从某个过去的时间点开始),加上你的偏移(以秒为单位),再通过 os.date 将其格式化为字符串(或表格,无论你喜欢哪种形式)。

print(os.date("%c"))    -- 打印当前时间 (08/15/15 10:45:55)

local seconds_since_xxx = os.time() -- 获取当前时间的秒数
seconds_since_xxx = seconds_since_xxx - (60 * 60 * 11)  -- 从时间中减去 11 小时

print(os.date("%c", seconds_since_xxx)) -- 打印计算后的时间 (08/14/15 23:45:55)
2015-08-15 08:47:43
用户5229743
用户5229743
function format_time(timestamp, format, tzoffset, tzname)
  -- 如果tzoffset等于“local”,则计算本地时间区域(适用于服务器)
  if tzoffset == "local" then
    local now = os.time()
    local local_t = os.date("*t", now)
    local utc_t = os.date("!*t", now)
    local delta = (local_t.hour - utc_t.hour)*60 + (local_t.min - utc_t.min)
    local h, m = math.modf( delta / 60)
    tzoffset = string.format("%+.4d", 100 * h + 60 * m)
  end
  
  tzoffset = tzoffset or "GMT-8" -- 设置默认时区为GMT-8
  format = format:gsub("%%z", tzname or tzoffset)
  if tzoffset == "GMT-8" then
    tzoffset = "-0800"
  end
  tzoffset = tzoffset:gsub(":", "")

  local sign = 1
  if tzoffset:sub(1,1) == "-" then -- 如果是负数,则设为负号,去掉第一个字符
    sign = -1
    tzoffset = tzoffset:sub(2)
  elseif tzoffset:sub(1,1) == "+" then -- 如果是正数,则去掉第一个字符
    tzoffset = tzoffset:sub(2)
  end
  tzoffset = sign * (tonumber(tzoffset:sub(1,2))*60 +  -- 将时区偏移量转换为秒数
  tonumber(tzoffset:sub(3,4)))*60
  return os.date(format, timestamp + tzoffset) -- 计算时间戳,并以设定格式返回
end

print (format_time(os.time(), "%A")) -- 显示星期几

所以,事实证明我对问题的考虑还不够全面。这段代码提供了我所需要的确切函数。

2015-08-15 09:03:39
用户5229743
用户5229743

另一种更短的方法

local offset = 8
function getServerDay()
    local timeNow = os.date("*t")
    timeNow.day = timeNow.day - 1
    local timeYesterday = os.time(timeNow)

    return tonumber(os.date("%H")) >= offset and os.date("%A") or os.date("%A", timeYesterday)
end

print(getServerDay())
2015-08-15 12:29:44
用户282536
用户282536

使用类库,比如 luatz,它允许你在不同的时区之间进行复杂日期计算。

2015-08-18 06:59:34