luci-mod-system: use localized time
authorAndy Chiang <[email protected]>
Wed, 15 Oct 2025 17:48:45 +0000 (00:48 +0700)
committerPaul Donald <[email protected]>
Mon, 20 Oct 2025 18:40:46 +0000 (20:40 +0200)
use localized time

Signed-off-by: Andy Chiang <[email protected]>
modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js
modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json

index 2ed2b1fedbccb3c21615374ac4bd842cb921aa44..40110f62f020423cc1be0176788e68dc0093387e 100644 (file)
@@ -8,7 +8,7 @@
 'require tools.widgets as widgets';
 
 var callRcList, callRcInit, callTimezone,
-    callGetLocaltime, callSetLocaltime, CBILocalTime;
+    callGetUnixtime, callSetLocaltime, CBILocalTime;
 
 callRcList = rpc.declare({
        object: 'rc',
@@ -29,10 +29,10 @@ callRcInit = rpc.declare({
        expect: { result: false }
 });
 
-callGetLocaltime = rpc.declare({
-       object: 'system',
-       method: 'info',
-       expect: { localtime: 0 }
+callGetUnixtime = rpc.declare({
+       object: 'luci',
+       method: 'getUnixtime',
+       expect: { result: 0 }
 });
 
 callSetLocaltime = rpc.declare({
@@ -49,16 +49,17 @@ callTimezone = rpc.declare({
 });
 
 function formatTime(epoch) {
-       var date = new Date(epoch * 1000);
-
-       return '%04d-%02d-%02d %02d:%02d:%02d'.format(
-               date.getUTCFullYear(),
-               date.getUTCMonth() + 1,
-               date.getUTCDate(),
-               date.getUTCHours(),
-               date.getUTCMinutes(),
-               date.getUTCSeconds()
-       );
+       var date = new Date(epoch * 1000),
+               zn = uci.get('system', '@system[0]', 'zonename')?.replaceAll(' ', '_') || 'UTC',
+               ts = uci.get('system', '@system[0]', 'clock_timestyle'),
+               hc = uci.get('system', '@system[0]', 'clock_hourcycle');
+
+       return new Intl.DateTimeFormat(undefined, {
+               dateStyle: 'medium',
+               timeStyle: (ts == 0) ? 'long' : 'full',
+               hourCycle: hc,
+               timeZone: zn
+       }).format(date);
 }
 
 CBILocalTime = form.DummyValue.extend({
@@ -97,7 +98,7 @@ return view.extend({
                return Promise.all([
                        callRcList('sysntpd'),
                        callTimezone(),
-                       callGetLocaltime(),
+                       callGetUnixtime(),
                        uci.load('luci'),
                        uci.load('system')
                ]);
@@ -106,7 +107,7 @@ return view.extend({
        render: function(rpc_replies) {
                var ntpd_enabled = rpc_replies[0],
                    timezones = rpc_replies[1],
-                   localtime = rpc_replies[2],
+                   unixtime  = rpc_replies[2],
                    m, s, o;
 
                m = new form.Map('system',
@@ -129,7 +130,7 @@ return view.extend({
                 */
 
                o = s.taboption('general', CBILocalTime, '_systime', _('Local Time'));
-               o.cfgvalue = function() { return localtime };
+               o.cfgvalue = function() { return unixtime };
                o.ntpd_support = ntpd_enabled;
 
                o = s.taboption('general', form.Value, 'hostname', _('Hostname'));
@@ -155,6 +156,14 @@ return view.extend({
                        uci.set('system', section_id, 'timezone', tz);
                };
 
+               o = s.taboption('general', form.Flag, 'clock_timestyle', _('Full TimeZone Name'), _('Unchecked means the timezone offset (E.g. GMT+1) is displayed'));
+               o.default = o.enabled;
+
+               o = s.taboption('general', form.ListValue, 'clock_hourcycle', _('Time Format'));
+               o.value('', _('Default'));
+               o.value('h12', _('12-Hour Clock'));
+               o.value('h23', _('24-Hour Clock'));
+
                /*
                 * Logging
                 */
@@ -309,7 +318,7 @@ return view.extend({
 
                return m.render().then(function(mapEl) {
                        poll.add(function() {
-                               return callGetLocaltime().then(function(t) {
+                               return callGetUnixtime().then(function(t) {
                                        mapEl.querySelector('#localtime').value = formatTime(t);
                                });
                        });
index c61338893b8595e73fe4f2b9e73bbf3663d32bf0..379d89fc6fcbc283dc974f65cd70590af1bb5292 100644 (file)
@@ -3,9 +3,8 @@
                "description": "Grant access to system configuration",
                "read": {
                        "ubus": {
-                               "luci": [ "getLEDs", "getTimezones", "getUSBDevices" ],
-                               "rc": [ "list" ],
-                               "system": [ "info" ]
+                               "luci": [ "getLEDs", "getTimezones", "getUSBDevices", "getUnixtime" ],
+                               "rc": [ "list" ]
                        },
                        "uci": [ "luci", "system" ]
                },