diff --git a/shell/plugins/bar/widgets/clock.qml b/shell/plugins/bar/widgets/clock.qml index eee8ef46..392f8833 100644 --- a/shell/plugins/bar/widgets/clock.qml +++ b/shell/plugins/bar/widgets/clock.qml @@ -9,10 +9,31 @@ BarWidget { property bool alt: false + // Qt.formatDateTime doesn't recognize `ww` (ISO week number). Pre-substitute + // it as a Qt-quoted literal before formatting so users can write the natural + // `'W'ww yyyy` and get `W21 2026` rather than `Www 2026`. + function isoWeek(date) { + var d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate())) + var day = d.getUTCDay() || 7 + d.setUTCDate(d.getUTCDate() + 4 - day) + var yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1)) + return Math.ceil(((d - yearStart) / 86400000 + 1) / 7) + } + + function format(date, fmt) { + var f = String(fmt || "") + if (f.indexOf("ww") !== -1) { + var w = isoWeek(date) + var ww = w < 10 ? "0" + w : String(w) + f = f.replace(/ww/g, "'" + ww + "'") + } + return Qt.formatDateTime(date, f) + } + function label() { - if (alt) return Qt.formatDateTime(clock.date, String(setting("formatAlt", "dd MMMM 'W'ww yyyy"))) - if (bar && bar.vertical) return Qt.formatDateTime(clock.date, String(setting("verticalFormat", "HH\n—\nmm"))) - return Qt.formatDateTime(clock.date, String(setting("format", "dddd HH:mm"))) + if (alt) return format(clock.date, setting("formatAlt", "dd MMMM 'W'ww yyyy")) + if (bar && bar.vertical) return format(clock.date, setting("verticalFormat", "HH\n—\nmm")) + return format(clock.date, setting("format", "dddd HH:mm")) } implicitWidth: button.implicitWidth diff --git a/shell/plugins/settings/SettingsPanel.qml b/shell/plugins/settings/SettingsPanel.qml index 82545dc5..960bb847 100644 --- a/shell/plugins/settings/SettingsPanel.qml +++ b/shell/plugins/settings/SettingsPanel.qml @@ -132,7 +132,7 @@ Item { layout: { left: [{ id: "omarchy" }, { id: "workspaces" }], center: [ - { id: "clock", format: "dddd HH:mm", formatAlt: "dd MMMM yyyy", verticalFormat: "HH\n\u2014\nmm" }, + { id: "clock", format: "dddd HH:mm", formatAlt: "dd MMMM 'W'ww yyyy", verticalFormat: "HH\n\u2014\nmm" }, { id: "weather" }, { id: "indicators", items: [ "dnd", "nightlight", "stayAwake", "screenrecording", "dictation" ] }, { id: "systemUpdate" } ], right: [ @@ -1205,7 +1205,7 @@ Item { } ClockField { fieldKey: "formatAlt" - text: clockForm.entry.formatAlt || "dd MMMM yyyy" + text: clockForm.entry.formatAlt || "dd MMMM 'W'ww yyyy" } Text { diff --git a/shell/shell-defaults.json b/shell/shell-defaults.json index c7546863..2678bd21 100644 --- a/shell/shell-defaults.json +++ b/shell/shell-defaults.json @@ -21,7 +21,7 @@ { "id": "clock", "format": "dddd HH:mm", - "formatAlt": "dd MMMM yyyy", + "formatAlt": "dd MMMM 'W'ww yyyy", "verticalFormat": "HH\n\u2014\nmm" }, {