Delphi调用TFile.SetCreationTime跨夏令时加1小时如何不受DST影响
问题原因
你调用的TFile.SetCreationTime默认接收本地时间参数,系统写入文件时实际存储的是UTC时间,Windows资源管理器显示时会再将UTC时间按当前系统的时区与夏令时规则转换为本地时间,跨夏令时时段的时间就会出现1小时的偏移。
解决方法
要完全规避夏令时影响,你需要将目标时间转换为不带夏令时偏移的UTC时间,调用UTC专属的文件时间写入方法即可:
C# 实现代码
// 定义目标固定时间 DateTime targetLocalTime = new DateTime(2021, 5, 14, 2, 27, 0, DateTimeKind.Unspecified); TimeZoneInfo localZone = TimeZoneInfo.Local; // 转换UTC时强制忽略夏令时调整 DateTime targetUtcTime = TimeZoneInfo.ConvertTimeToUtc(targetLocalTime, localZone, TimeZoneInfoOptions.NoDaylightSaving); // 写入UTC时间 TFile.SetCreationTimeUtc(FilePath, targetUtcTime);
Delphi 实现代码
var targetLocalTime: TDateTime; targetUtcTime: TDateTime; begin targetLocalTime := EncodeDateTime(2021, 5, 14, 2, 27, 0, 0); // 第二个参数设为False,转换UTC时不应用夏令时偏移 targetUtcTime := TTimeZone.Local.ToUniversalTime(targetLocalTime, False); TFile.SetCreationTimeUtc(FilePath, targetUtcTime); end;
原理说明
文件系统底层统一存储UTC时间,你提前将目标本地时间转换为忽略夏令时的UTC值写入,后续系统读取转换为本地时间时,就会固定显示你指定的02:27:00,不受当前系统是否处于夏令时时段影响。
内容的提问来源于stack exchange,提问作者m227
相关产品推荐
相关产品推荐

