[Bugfix] FS#13902 lua strfrtime wrong month field, did not add one to month

rockbox-gerrit-noreply--- via rockbox-cvs <[email protected]> Fri, 22 May 2026 18:13:13 -0400
Newsgroups gmane.comp.systems.archos.rockbox.cvs
Message-ID <[email protected]>
commit f456dbfa52664a8c39823570327bd56563115030
Author: William Wilgus <[email protected]>
Date:   Fri May 22 16:57:35 2026 -0400

    [Bugfix] FS#13902 lua strfrtime wrong month field, did not add one to month
    
    posix month field is called mon not month
    mon goes from 0-11 so strfrtime needs to add 1 to the number for %m
    day of week goes 0-6 where 0 = sunday
    day of year goes 0-365 (365 on a leap year)
    
    according to lua everything starts at 1
    so month is 1-12
    day of week goes 1-7 1 = sunday
    day of year is 1-365 (366 on a leap year)
    
    added some fields in the time_date example
    
    Change-Id: Icd502b172285d23133488aa3456786d756667bfa

diff --git a/apps/plugins/lua/include_lua/strftime.lua b/apps/plugins/lua/include_lua/strftime.lua
index 6cf449aeec..2ed89ada12 100644
--- a/apps/plugins/lua/include_lua/strftime.lua
+++ b/apps/plugins/lua/include_lua/strftime.lua
@@ -73,13 +73,13 @@ local function strftime(tmfmt, tm)
                     elseif c == "F" then
                         out = strftime("%Y-%m-%d", tm)
                     elseif c == "a" then
-                        out = weekdays[tm.wday + 1]:sub(1, 3)
+                        out = weekdays[tm.wday]:sub(1, 3)
                     elseif c == "A" then
-                        out = weekdays[tm.wday + 1]
+                        out = weekdays[tm.wday]
                     elseif c == "h" or c == "b" then
-                        out = months[tm.month + 1]:sub(1, 3)
+                        out = months[tm.month]:sub(1, 3)
                     elseif c == "B" then
-                        out = months[tm.month + 1]
+                        out = months[tm.month]
                     elseif c == "p" then
                         --local idx = tm.hour > 12 and 4 or 5
                         out = tm.hour > 12 and "PM" or "AM"
@@ -108,30 +108,36 @@ local function strftime(tmfmt, tm)
                         if no == 0 then no = 12 end
                         out = strformat("%2.0d", no)
                     elseif c == "m" then
-                        out = strformat("%02d", tm.mon)
+                        out = strformat("%02d", tm.month)
                     elseif c == "M" then
                         out = strformat("%02d", tm.min)
                     elseif c == "S" then
                         out = strformat("%02d", tm.sec)
                     elseif c == "u" then
-                        local no = tm.wday == 0 and 7 or tm.wday
+                        local wday = tm.wday - 1
+                        local no = wday == 0 and 7 or wday
                         out = strformat("%d", no)
                     elseif c == "w" then
                         out = strformat("%d", tm.wday)
                     elseif c == "U" then
-                        local no = ((tm.yday - tm.wday + 7) / 7)
+                        local yday = tm.yday - 1
+                        local wday = tm.wday - 1
+                        local no = ((yday - wday + 7) / 7) + 1
                         out = strformat("%02d", no)
                     elseif c == "W" then
-                        local no = ((tm.yday - (tm.wday + 7) % 7 + 7) / 7)
+                        local yday = tm.yday - 1
+                        local wday = tm.wday - 1
+                        local no = ((yday - (wday + 7) % 7 + 7) / 7) + 1
                         out = strformat("%02d", no)
                     elseif c == "s" then
                         out = os.time()
                     elseif c == "Z" then
                         out = "[ETC?]"
                     elseif c == "Y" then
-                        local y1 = (tm.year / 100) + 19
+                    --[[local y1 = (tm.year / 100) + 19
                         local y2 = tm.year % 100
-                        out = strformat("%02d%02d", y1, y2)
+                        out = strformat("%02d%02d", y1, y2)]]
+                        out = strformat("%04d", tm.year)
                     elseif c == "y" then
                         out = strformat("%02d", tm.year % 100)
                     elseif c == "O" or c == "E" then
@@ -160,14 +166,14 @@ Note: This implementation assumes the following structure for the `tm`
 table (similar to C's `struct tm`):
 
 local tm = {
-    year = 126,    -- Years since 1900
-    mon = 0,       -- Month (0-11)
+    year = 2026,   -- Year
+    month = 1,     -- Month (1-12)
     day = 5,       -- Day of month (1-31)
     hour = 14,     -- Hours (0-23)
     min = 30,      -- Minutes (0-59)
     sec = 45,      -- Seconds (0-59)
-    wday = 2,      -- Day of week (0-6, Sunday=0)
-    yday = 4,      -- Day of year (0-365)
+    wday = 2,      -- Day of week (1-7, Sunday=1)
+    yday = 4,      -- Day of year (1-366)
     isdst = false  -- Daylight saving time flag
 }
 
@@ -235,11 +241,11 @@ local function get_tmdate(d, tm)
     end
 
     tm = tm or {}
-    tm.year = y + UNIX_EPOCH_YEAR -- year - 1900
-    tm.month = x0 -- 0..11
-    tm.yday = tm_yday
+    tm.year = y + UNIX_EPOCH_YEAR + 1900 -- year + 1900
+    tm.month = x0 + 1 -- (0..11) + 1
+    tm.yday = tm_yday + 1
     tm.day = yday - mon_yday[x0 + 1] + 1 -- 1..31
-    tm.wday = (d + 1) % 7 -- 0..6
+    tm.wday = (d + 1) % 7 + 1 -- (0..6) + 1
     return tm--return tm
 end
 
diff --git a/apps/plugins/lua_scripts/time_date.lua b/apps/plugins/lua_scripts/time_date.lua
index 63a3e611d1..20ed8dca47 100644
--- a/apps/plugins/lua_scripts/time_date.lua
+++ b/apps/plugins/lua_scripts/time_date.lua
@@ -26,7 +26,7 @@ local tmo_noblock = -1
 local ctx = 0 --CONTEXT_STD
 
 while rb.get_action(ctx, 50) == 0 do
-    rb.splash(0, os.date())
+    rb.splash(0, os.date("%a %m/%d/%y %T (%b) %Y"))
 end
 
 collectgarbage("collect")
-- 
rockbox-cvs mailing list
[email protected]
https://lists.haxx.se/mailman/listinfo/rockbox-cvs