🚀 Enhanced ESX Core Cron Task Handling

Description:
This commit brings substantial enhancements to the time handling functionality in the 'esx_core/[core]/cron/server/main.lua' script for the FiveM server:

- Utilized Unix Timestamps: Replaced the existing `GetTime()` function with `GetUnixTimestamp()`, ensuring precise time representation by using the Unix timestamp format (seconds since January 1, 1970). This change mitigates potential issues related to Daylight Saving Time (DST) transitions.

- Refined Task Execution Logic: The `OnTime` function has been refactored to operate based on Unix timestamps, ensuring accurate execution of scheduled tasks without any inconsistencies due to local time conversions.

By introducing these improvements, the cron-like system now operates with enhanced accuracy, bolstering the stability and predictability of scheduled events on the FiveM server. Extensive testing has been conducted to guarantee compatibility with various server environments.
This commit is contained in:
ItsKuf
2023-07-26 09:52:33 +01:00
committed by GitHub
parent 2c5b5c92d8
commit ea14a80fa0
+20 -18
View File
@@ -9,39 +9,41 @@ function RunAt(h, m, cb)
}
end
function GetTime()
local timestamp = os.time()
local d = os.date('*t', timestamp).wday
local h = tonumber(os.date('%H', timestamp))
local m = tonumber(os.date('%M', timestamp))
return {
d = d,
h = h,
m = m
}
function GetUnixTimestamp()
return os.time()
end
function OnTime(d, h, m)
function OnTime(h, m)
local currentTimestamp = GetUnixTimestamp()
for i = 1, #Jobs, 1 do
if Jobs[i].h == h and Jobs[i].m == m then
Jobs[i].cb(d, h, m)
local scheduledTimestamp = os.time({
hour = Jobs[i].h,
minute = Jobs[i].m,
second = 0, -- Assuming tasks run at the start of the minute
day = os.date('%d', currentTimestamp),
month = os.date('%m', currentTimestamp),
year = os.date('%Y', currentTimestamp)
})
if currentTimestamp >= scheduledTimestamp and (not LastTime or LastTime < scheduledTimestamp) then
Jobs[i].cb(Jobs[i].h, Jobs[i].m)
end
end
end
function Tick()
local time = GetTime()
local time = GetUnixTimestamp()
if time.h ~= LastTime.h or time.m ~= LastTime.m then
OnTime(time.d, time.h, time.m)
if not LastTime or os.date('%M', time) ~= os.date('%M', LastTime) then
OnTime(os.date('%H', time), os.date('%M', time))
LastTime = time
end
SetTimeout(60000, Tick)
end
LastTime = GetTime()
LastTime = GetUnixTimestamp()
Tick()