这个函数用于调整时间戳以适应不同的时区。它接受五个参数:`format`、`timeStamp`、`dontFixForTimeOffset`、`currentServerTimeZone`和`showLog`。返回 os.date,可以转化成指定格式的年月日时间
功能
该函数的主要功能是根据给定的时区偏移量调整时间戳,并返回格式化后的日期字符串。如果`dontFixForTimeOffset`为真或者时间戳小于31536001(即1970年1月1日之后的秒数),则直接返回原始时间戳的格式化日期。否则,它会根据当前服务器时区与本地时区之间的差异调整时间戳,并返回调整后的日期字符串。
参数
-
`format`:日期格式字符串,用于指定返回日期字符串的格式。
-
`timeStamp`:要调整的时间戳。如果未提供,则默认使用当前时间。
-
`dontFixForTimeOffset`:布尔值,指示是否不调整时区偏移量。
-
`currentServerTimeZone`:当前服务器的时区偏移量。如果未提供,则使用默认的`TimeUtil.timeZone`。
-
`showLog`:布尔值,指示是否在日志中显示调试信息。
实现原理
-
**日志记录**:如果`showLog`为真,则记录时间戳和其类型。
-
**默认时间戳**:如果未提供时间戳,则使用当前时间。
-
**时区偏移量计算**:如果`dontFixForTimeOffset`为假且时间戳大于31536001,则计算当前服务器时区与本地时区之间的偏移量。
-
**时间戳格式判断**:判断时间戳是秒还是毫秒。如果是毫秒,则将其转换为秒。
-
**时区调整**:根据时区偏移量调整时间戳,并考虑夏令时的影响。
-
**格式化日期**:使用调整后的时间戳格式化日期字符串。
-
**日志记录**:如果`showLog`为真,则记录调整后的时间戳。
-
**返回结果**:返回格式化后的日期字符串。
注意事项
-
确保在调用此函数之前,`TimeUtil`对象已经正确初始化,并且`getTimeZone`方法能够返回正确的时区偏移量。
-
`currentServerTimeZone`参数应该是一个整数,表示时区偏移量(例如,中国标准时间(CST)为+8小时,偏移量为8)。
-
`timeStamp`参数可以是秒或毫秒,函数会自动进行转换。
-
如果`showLog`为真,则会在日志中输出调试信息,这可能会影响性能,建议在生产环境中关闭。
Lua
function TimeUtil:fixTimeZoneFor_LUA_OS_DATE(format, timeStamp,dontFixForTimeOffset, currentServerTimeZone, showLog)
if showLog then
print("[fixTimeZoneFor_LUA_OS_DATE] : %s-%s",timeStamp,type(timeStamp))
end
if timeStamp == nil then
timeStamp = os.time()
end
if dontFixForTimeOffset or timeStamp < 31536001 then
return os.date(format, timeStamp)
else
-- 8 hour * 3600 seconds = 28800 seconds
local timeZone = self:getTimeZone()
if currentServerTimeZone == nil then
currentServerTimeZone = TimeUtil.timeZone
end
local timeZoneOffset = currentServerTimeZone - timeZone
local isMilli = false
if timeStamp == nil then
isMilli = false
else
timeStamp = math.ceil(timeStamp)
-- 判定毫秒与秒
local numberStr = tostring(math.ceil(timeStamp))
if #numberStr <= 10 then
isMilli = false
elseif #numberStr == 13 then
isMilli = true
end
end
local eastEightTimeStamp
if isMilli == false then
eastEightTimeStamp = timeStamp + (timeZoneOffset) * 3600 + (os.date("*t", timeStamp).isdst and -1 or 0) * 3600
elseif isMilli then
timeStamp = math.ceil(tonumber(timeStamp) / 1000)
eastEightTimeStamp = timeStamp + (timeZoneOffset) * 3600 + (os.date("*t", timeStamp).isdst and -1 or 0) * 3600
else
Logger.print("[FixTimeZone Exception] Fatal timestamp format : %s", timeStamp)
end
if showLog then
Logger.print("[eastEightTimeStamp] : %s", eastEightTimeStamp)
end
--return timeStamp
return os.date(format, eastEightTimeStamp)
end
end