case 4682 - automatic backup runs at the chosen time on the server's clock all year
The backup time is stored as the UTC moment it meant on the day it was set and was run at that UTC hour every day, so on servers with daylight saving it ran an hour off the chosen time for part of the year. SetNextBackup now recovers the clock time with the stored date's offset and runs it on the server's local days. No migration. Backup manual page and changelog. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -63,22 +63,36 @@ namespace AyaNova.Util
|
||||
internal static void SetNextBackup()
|
||||
{
|
||||
DateTime utcNow = DateTime.UtcNow;
|
||||
//case 4682: the backup time is a time on the server's clock; days are the server's local days
|
||||
DateTime localToday = TimeZoneInfo.ConvertTimeFromUtc(utcNow, TimeZoneInfo.Local).Date;
|
||||
//Has last backup run more than 24 hours ago?
|
||||
if (NextBackup < utcNow.AddHours(-24))
|
||||
{
|
||||
//set it to today then
|
||||
NextBackup = new DateTime(utcNow.Year, utcNow.Month, utcNow.Day, Backup.BackupTime.Hour, Backup.BackupTime.Minute, 0, DateTimeKind.Utc);
|
||||
NextBackup = BackupTimeOnLocalDay(localToday);
|
||||
//Make sure next backup is in the future
|
||||
if (NextBackup < utcNow)
|
||||
NextBackup = NextBackup.AddDays(1);
|
||||
NextBackup = BackupTimeOnLocalDay(localToday.AddDays(1));
|
||||
}
|
||||
else
|
||||
{
|
||||
//less than 24 hours, set it to tomorrow
|
||||
NextBackup = new DateTime(utcNow.Year, utcNow.Month, utcNow.Day, Backup.BackupTime.Hour, Backup.BackupTime.Minute, 0, DateTimeKind.Utc);
|
||||
NextBackup = NextBackup.AddDays(1);
|
||||
NextBackup = BackupTimeOnLocalDay(localToday.AddDays(1));
|
||||
}
|
||||
}
|
||||
|
||||
//case 4682: the backup time is stored as the UTC moment it meant on the day it was set, and was run at that UTC hour
|
||||
//every day, so it moved an hour on the server's clock with each daylight saving change. The server's clock time is
|
||||
//recovered with that day's offset and the backup is run at that clock time on the given local day (UTC returned)
|
||||
private static DateTime BackupTimeOnLocalDay(DateTime localDay)
|
||||
{
|
||||
var chosen = TimeZoneInfo.ConvertTimeFromUtc(DateTime.SpecifyKind(Backup.BackupTime, DateTimeKind.Utc), TimeZoneInfo.Local);
|
||||
var local = DateTime.SpecifyKind(localDay.Date + new TimeSpan(chosen.Hour, chosen.Minute, 0), DateTimeKind.Unspecified);
|
||||
//a time skipped when the clocks go forward (e.g. 2:30 AM that night) runs an hour later
|
||||
if (TimeZoneInfo.Local.IsInvalidTime(local))
|
||||
local = local.AddHours(1);
|
||||
return TimeZoneInfo.ConvertTimeToUtc(local, TimeZoneInfo.Local);
|
||||
}
|
||||
|
||||
}//eoc
|
||||
}//eons
|
||||
Reference in New Issue
Block a user