From 0e33dca7f29cc468e9264e8c4df1b26a671819e7 Mon Sep 17 00:00:00 2001 From: Mitch Capper Date: Wed, 22 Oct 2025 14:39:37 -0700 Subject: [PATCH] Ensure correct timezone is set on filetimes --- Library/DiscUtils.Btrfs/Base/TimeSpec.cs | 4 ++-- Library/DiscUtils.Core/Archives/TarHeader.cs | 6 +++--- Library/DiscUtils.Ext/File.cs | 8 ++++---- Library/DiscUtils.Lvm/Metadata.cs | 2 +- Library/DiscUtils.SquashFs/Inode.cs | 2 +- Library/DiscUtils.SquashFs/SuperBlock.cs | 2 +- Library/DiscUtils.Xfs/Inode.cs | 2 +- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Library/DiscUtils.Btrfs/Base/TimeSpec.cs b/Library/DiscUtils.Btrfs/Base/TimeSpec.cs index c0760e63e..a5964a591 100644 --- a/Library/DiscUtils.Btrfs/Base/TimeSpec.cs +++ b/Library/DiscUtils.Btrfs/Base/TimeSpec.cs @@ -39,11 +39,11 @@ internal class TimeSpec : IByteArraySerializable /// public uint Nanoseconds { get; internal set; } - public DateTimeOffset Value => DateTimeOffset.FromUnixTimeSeconds(Seconds).AddTicks(Nanoseconds / 100); + public DateTimeOffset Value => DateTimeOffset.FromUnixTimeSeconds(Seconds).AddTicks(Nanoseconds / 100).UtcDateTime; public int Size => Length; - public DateTimeOffset DateTime => DateTimeOffset.FromUnixTimeSeconds(Seconds).AddTicks(Nanoseconds / 100); + public DateTimeOffset DateTime => DateTimeOffset.FromUnixTimeSeconds(Seconds).AddTicks(Nanoseconds / 100).UtcDateTime; public int ReadFrom(ReadOnlySpan buffer) { diff --git a/Library/DiscUtils.Core/Archives/TarHeader.cs b/Library/DiscUtils.Core/Archives/TarHeader.cs index a78925390..dc297946c 100644 --- a/Library/DiscUtils.Core/Archives/TarHeader.cs +++ b/Library/DiscUtils.Core/Archives/TarHeader.cs @@ -75,7 +75,7 @@ public TarHeader(ReadOnlySpan buffer) OwnerId = (int)OctalToLong(ReadNullTerminatedString(buffer.Slice(108, 8))); GroupId = (int)OctalToLong(ReadNullTerminatedString(buffer.Slice(116, 8))); FileLength = ParseFileLength(buffer.Slice(124, 12)); - ModificationTime = DateTimeOffset.FromUnixTimeSeconds((uint)OctalToLong(ReadNullTerminatedString(buffer.Slice(136, 12)))); + ModificationTime = DateTimeOffset.FromUnixTimeSeconds((uint)OctalToLong(ReadNullTerminatedString(buffer.Slice(136, 12)))).UtcDateTime; CheckSum = (int)OctalToLong(ReadNullTerminatedString(buffer.Slice(148, 8))); FileType = (TarFileType)buffer[156]; LinkName = latin1Encoding.GetString(ReadNullTerminatedString(buffer.Slice(157, 100))); @@ -93,8 +93,8 @@ public TarHeader(ReadOnlySpan buffer) FileName = $"{latin1Encoding.GetString(prefix)}/{FileName}"; } - LastAccessTime = DateTimeOffset.FromUnixTimeSeconds((uint)OctalToLong(ReadNullTerminatedString(buffer.Slice(476, 12)))); - CreationTime = DateTimeOffset.FromUnixTimeSeconds((uint)OctalToLong(ReadNullTerminatedString(buffer.Slice(488, 12)))); + LastAccessTime = DateTimeOffset.FromUnixTimeSeconds((uint)OctalToLong(ReadNullTerminatedString(buffer.Slice(476, 12)))).UtcDateTime; + CreationTime = DateTimeOffset.FromUnixTimeSeconds((uint)OctalToLong(ReadNullTerminatedString(buffer.Slice(488, 12)))).UtcDateTime; } public static bool IsValid(ReadOnlySpan buffer) diff --git a/Library/DiscUtils.Ext/File.cs b/Library/DiscUtils.Ext/File.cs index e8360dd77..328bb62a7 100644 --- a/Library/DiscUtils.Ext/File.cs +++ b/Library/DiscUtils.Ext/File.cs @@ -48,21 +48,21 @@ public File(Context context, uint inodeNum, Inode inode) public DateTime LastAccessTimeUtc { - get => DateTimeOffset.FromUnixTimeSeconds(Inode.AccessTime).DateTime; + get => DateTimeOffset.FromUnixTimeSeconds(Inode.AccessTime).UtcDateTime; set => throw new NotImplementedException(); } public DateTime LastWriteTimeUtc { - get => DateTimeOffset.FromUnixTimeSeconds(Inode.ModificationTime).DateTime; + get => DateTimeOffset.FromUnixTimeSeconds(Inode.ModificationTime).UtcDateTime; set => throw new NotImplementedException(); } public DateTime CreationTimeUtc { - get => DateTimeOffset.FromUnixTimeSeconds(Inode.CreationTime).DateTime; + get => DateTimeOffset.FromUnixTimeSeconds(Inode.CreationTime).UtcDateTime; set => throw new NotImplementedException(); } @@ -114,4 +114,4 @@ private static FileAttributes FromMode(uint mode) { return Utilities.FileAttributesFromUnixFileType((UnixFileType)((mode >> 12) & 0xF)); } -} \ No newline at end of file +} diff --git a/Library/DiscUtils.Lvm/Metadata.cs b/Library/DiscUtils.Lvm/Metadata.cs index c1c84d8d9..599f183b0 100644 --- a/Library/DiscUtils.Lvm/Metadata.cs +++ b/Library/DiscUtils.Lvm/Metadata.cs @@ -128,7 +128,7 @@ internal static DateTime ParseDateTimeValue(ReadOnlySpan value) return DateTime.MaxValue; } - return DateTimeOffset.FromUnixTimeSeconds((long)numeric).DateTime; + return DateTimeOffset.FromUnixTimeSeconds((long)numeric).UtcDateTime; } internal static ulong ParseNumericValue(ReadOnlySpan value) diff --git a/Library/DiscUtils.SquashFs/Inode.cs b/Library/DiscUtils.SquashFs/Inode.cs index 90b58ab34..344ecee34 100644 --- a/Library/DiscUtils.SquashFs/Inode.cs +++ b/Library/DiscUtils.SquashFs/Inode.cs @@ -51,7 +51,7 @@ public virtual int ReadFrom(ReadOnlySpan buffer) Mode = EndianUtilities.ToUInt16LittleEndian(buffer.Slice(2)); UidKey = EndianUtilities.ToUInt16LittleEndian(buffer.Slice(4)); GidKey = EndianUtilities.ToUInt16LittleEndian(buffer.Slice(6)); - ModificationTime = DateTimeOffset.FromUnixTimeSeconds(EndianUtilities.ToUInt32LittleEndian(buffer.Slice(8))).DateTime; + ModificationTime = DateTimeOffset.FromUnixTimeSeconds(EndianUtilities.ToUInt32LittleEndian(buffer.Slice(8))).UtcDateTime; InodeNumber = EndianUtilities.ToUInt32LittleEndian(buffer.Slice(12)); return 16; } diff --git a/Library/DiscUtils.SquashFs/SuperBlock.cs b/Library/DiscUtils.SquashFs/SuperBlock.cs index 232981910..896ff7430 100644 --- a/Library/DiscUtils.SquashFs/SuperBlock.cs +++ b/Library/DiscUtils.SquashFs/SuperBlock.cs @@ -78,7 +78,7 @@ public int ReadFrom(ReadOnlySpan buffer) } InodesCount = EndianUtilities.ToUInt32LittleEndian(buffer.Slice(4)); - CreationTime = DateTimeOffset.FromUnixTimeSeconds(EndianUtilities.ToUInt32LittleEndian(buffer.Slice(8))).DateTime; + CreationTime = DateTimeOffset.FromUnixTimeSeconds(EndianUtilities.ToUInt32LittleEndian(buffer.Slice(8))).UtcDateTime; BlockSize = EndianUtilities.ToUInt32LittleEndian(buffer.Slice(12)); FragmentsCount = EndianUtilities.ToUInt32LittleEndian(buffer.Slice(16)); Compression = (SquashFileSystemCompressionKind)EndianUtilities.ToUInt16LittleEndian(buffer.Slice(20)); diff --git a/Library/DiscUtils.Xfs/Inode.cs b/Library/DiscUtils.Xfs/Inode.cs index 0768dc615..030a89378 100644 --- a/Library/DiscUtils.Xfs/Inode.cs +++ b/Library/DiscUtils.Xfs/Inode.cs @@ -265,7 +265,7 @@ private static DateTime ReadTimestamp(ReadOnlySpan buffer) { var seconds = EndianUtilities.ToUInt32BigEndian(buffer); var nanoSeconds = EndianUtilities.ToUInt32BigEndian(buffer.Slice(4)); - return DateTimeOffset.FromUnixTimeSeconds(seconds).AddTicks(nanoSeconds / 100).LocalDateTime; + return DateTimeOffset.FromUnixTimeSeconds(seconds).AddTicks(nanoSeconds / 100).UtcDateTime; } void IByteArraySerializable.WriteTo(Span buffer)