diff --git a/src/settings-ui/Settings.UI.Library/UpdatingSettings.cs b/src/settings-ui/Settings.UI.Library/UpdatingSettings.cs
index b5244bbc0085..4a6065efae59 100644
--- a/src/settings-ui/Settings.UI.Library/UpdatingSettings.cs
+++ b/src/settings-ui/Settings.UI.Library/UpdatingSettings.cs
@@ -65,6 +65,16 @@ public string NewVersion
}
public string LastCheckedDateLocalized
+ {
+ get
+ {
+ var dt = LastCheckedDateTime;
+ return dt?.ToString(CultureInfo.CurrentCulture) ?? string.Empty;
+ }
+ }
+
+ [JsonIgnore]
+ public DateTime? LastCheckedDateTime
{
get
{
@@ -72,18 +82,18 @@ public string LastCheckedDateLocalized
{
if (LastCheckedDate == null)
{
- return string.Empty;
+ return null;
}
long seconds = long.Parse(LastCheckedDate, CultureInfo.CurrentCulture);
var date = DateTimeOffset.FromUnixTimeSeconds(seconds).UtcDateTime;
- return date.ToLocalTime().ToString(CultureInfo.CurrentCulture);
+ return date.ToLocalTime();
}
catch (Exception)
{
}
- return string.Empty;
+ return null;
}
}
diff --git a/src/settings-ui/Settings.UI/Helpers/FriendlyDateHelper.cs b/src/settings-ui/Settings.UI/Helpers/FriendlyDateHelper.cs
new file mode 100644
index 000000000000..c3d0f3ef2dc9
--- /dev/null
+++ b/src/settings-ui/Settings.UI/Helpers/FriendlyDateHelper.cs
@@ -0,0 +1,48 @@
+// Copyright (c) Microsoft Corporation
+// The Microsoft Corporation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Globalization;
+
+namespace Microsoft.PowerToys.Settings.UI.Helpers;
+
+public static class FriendlyDateHelper
+{
+ ///
+ /// Formats a as a friendly relative string.
+ /// Today → "Today at 1:22 PM", Yesterday → "Yesterday at 3:45 PM",
+ /// older dates fall back to the full culture-specific date/time format.
+ ///
+ public static string Format(DateTime? dateTime)
+ {
+ if (dateTime is not DateTime dt)
+ {
+ return string.Empty;
+ }
+
+ var resourceLoader = ResourceLoaderInstance.ResourceLoader;
+ var today = DateTime.Now.Date;
+ var time = dt.ToString("t", CultureInfo.CurrentCulture);
+
+ if (dt.Date == today)
+ {
+ var fmt = resourceLoader.GetString("General_LastCheckedDate_TodayAt");
+ if (!string.IsNullOrEmpty(fmt))
+ {
+ return string.Format(CultureInfo.CurrentCulture, fmt, time);
+ }
+ }
+
+ if (dt.Date == today.AddDays(-1))
+ {
+ var fmt = resourceLoader.GetString("General_LastCheckedDate_YesterdayAt");
+ if (!string.IsNullOrEmpty(fmt))
+ {
+ return string.Format(CultureInfo.CurrentCulture, fmt, time);
+ }
+ }
+
+ return dt.ToString(CultureInfo.CurrentCulture);
+ }
+}
diff --git a/src/settings-ui/Settings.UI/SettingsXAML/Controls/Dashboard/CheckUpdateControl.xaml b/src/settings-ui/Settings.UI/SettingsXAML/Controls/Dashboard/CheckUpdateControl.xaml
index 971e151ea110..af019fc9ff46 100644
--- a/src/settings-ui/Settings.UI/SettingsXAML/Controls/Dashboard/CheckUpdateControl.xaml
+++ b/src/settings-ui/Settings.UI/SettingsXAML/Controls/Dashboard/CheckUpdateControl.xaml
@@ -72,7 +72,7 @@
-
+
diff --git a/src/settings-ui/Settings.UI/SettingsXAML/Controls/Dashboard/CheckUpdateControl.xaml.cs b/src/settings-ui/Settings.UI/SettingsXAML/Controls/Dashboard/CheckUpdateControl.xaml.cs
index 36a20fd34002..8ad96462157c 100644
--- a/src/settings-ui/Settings.UI/SettingsXAML/Controls/Dashboard/CheckUpdateControl.xaml.cs
+++ b/src/settings-ui/Settings.UI/SettingsXAML/Controls/Dashboard/CheckUpdateControl.xaml.cs
@@ -2,6 +2,7 @@
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
+using Microsoft.PowerToys.Settings.UI.Helpers;
using Microsoft.PowerToys.Settings.UI.Library;
using Microsoft.PowerToys.Settings.UI.Services;
using Microsoft.PowerToys.Settings.UI.Views;
@@ -15,11 +16,14 @@ public sealed partial class CheckUpdateControl : UserControl
public UpdatingSettings UpdateSettingsConfig { get; set; }
+ public string LastCheckedDateFriendly { get; set; }
+
public CheckUpdateControl()
{
InitializeComponent();
UpdateSettingsConfig = UpdatingSettings.LoadSettings();
UpdateAvailable = UpdateSettingsConfig != null && (UpdateSettingsConfig.State == UpdatingSettings.UpdatingState.ReadyToInstall || UpdateSettingsConfig.State == UpdatingSettings.UpdatingState.ReadyToDownload);
+ LastCheckedDateFriendly = FriendlyDateHelper.Format(UpdateSettingsConfig?.LastCheckedDateTime);
}
private void SWVersionButtonClicked(object sender, Microsoft.UI.Xaml.RoutedEventArgs e)
diff --git a/src/settings-ui/Settings.UI/Strings/en-us/Resources.resw b/src/settings-ui/Settings.UI/Strings/en-us/Resources.resw
index d8c15fa1c25e..f36127908583 100644
--- a/src/settings-ui/Settings.UI/Strings/en-us/Resources.resw
+++ b/src/settings-ui/Settings.UI/Strings/en-us/Resources.resw
@@ -1377,6 +1377,14 @@ opera.exe
Last checked:
+
+ Today at {0}
+ Friendly date format when the last update check was today. {0} is the localized short time, e.g. "Today at 1:22 PM".
+
+
+ Yesterday at {0}
+ Friendly date format when the last update check was yesterday. {0} is the localized short time, e.g. "Yesterday at 3:45 PM".
+
Created at:
diff --git a/src/settings-ui/Settings.UI/ViewModels/GeneralViewModel.cs b/src/settings-ui/Settings.UI/ViewModels/GeneralViewModel.cs
index 5ffc96d6a80a..1f0458a09878 100644
--- a/src/settings-ui/Settings.UI/ViewModels/GeneralViewModel.cs
+++ b/src/settings-ui/Settings.UI/ViewModels/GeneralViewModel.cs
@@ -188,7 +188,7 @@ public GeneralViewModel(ISettingsRepository settingsRepository,
_updatingState = UpdatingSettingsConfig.State;
_newAvailableVersion = UpdatingSettingsConfig.NewVersion;
_newAvailableVersionLink = UpdatingSettingsConfig.ReleasePageLink;
- _updateCheckedDate = UpdatingSettingsConfig.LastCheckedDateLocalized;
+ _updateCheckedDate = FriendlyDateHelper.Format(UpdatingSettingsConfig.LastCheckedDateTime);
_newUpdatesToastIsGpoDisabled = GPOWrapper.GetDisableNewUpdateToastValue() == GpoRuleConfigured.Enabled;
_autoDownloadUpdatesIsGpoDisabled = GPOWrapper.GetDisableAutomaticUpdateDownloadValue() == GpoRuleConfigured.Enabled;
@@ -1383,7 +1383,7 @@ public void RefreshUpdatingState()
}
else
{
- bool dateChanged = UpdateCheckedDate == UpdatingSettingsConfig.LastCheckedDateLocalized;
+ bool dateChanged = UpdateCheckedDate == FriendlyDateHelper.Format(UpdatingSettingsConfig.LastCheckedDateTime);
bool fileDownloaded = string.IsNullOrEmpty(UpdatingSettingsConfig.DownloadedInstallerFilename);
IsNewVersionDownloading = !(dateChanged || fileDownloaded);
}
@@ -1391,7 +1391,7 @@ public void RefreshUpdatingState()
PowerToysUpdatingState = UpdatingSettingsConfig.State;
PowerToysNewAvailableVersion = UpdatingSettingsConfig.NewVersion;
PowerToysNewAvailableVersionLink = UpdatingSettingsConfig.ReleasePageLink;
- UpdateCheckedDate = UpdatingSettingsConfig.LastCheckedDateLocalized;
+ UpdateCheckedDate = FriendlyDateHelper.Format(UpdatingSettingsConfig.LastCheckedDateTime);
_isNoNetwork = PowerToysUpdatingState == UpdatingSettings.UpdatingState.NetworkError;
NotifyPropertyChanged(nameof(IsNoNetwork));