我有一个DateTime,需要将其转换为NodaTime LocalDate。能做到吗?

我有这个:

 DateTime modifiedDate = File.GetLastWriteTime(file);

我想要这个:
LocalTime modifiedDate = File.GetLastWriteTime(file);

但看起来NodaTime API 无法从GetLastWriteTime获取日期值。

所以我要么需要
a)将DateTime转换为LocalTime或
b)以某种方式使用LocalTime从GetLastWriteTime获取日期值

最佳答案

Noda Time的主要设计决策之一是,计算机本地时区设置不应产生任何副作用。在内部,GetLastWriteTime调用GetLastWriteTimeUtc().ToLocalTime()。因此,仅通过调用GetLastWriteTime,您就违反了这一理想。

读取文件时间的正确Noda Time类型是Instant

Instant instant = Instant.FromDateTimeUtc(File.GetLastWriteTimeUtc(file));

从那里开始,如果您需要本地日期和/或时间,则可以应用时区。

首先,确定所需的时区。例如:
DateTimeZone zone = DateTimeZoneProviders.Tzdb["America/New_York"];

如果出于某种原因想要使用计算机自己的本地时区,请使用以下命令:
DateTimeZone zone = DateTimeZoneProviders.Tzdb.GetSystemDefault();

然后将时区应用于文件时间的瞬间:
ZonedDateTime zonedDateTime = instant.InZone(zone);

然后,您可以根据要查找的内容从以下任意项中进行选择:
LocalDateTime localDateTime = zonedDateTime.LocalDateTime;
LocalDate date = zonedDateTime.Date;
LocalTime time = zonedDateTime.TimeOfDay;

另外,您应该了解,在磁盘上,文件时间取决于您使用的文件系统的类型。
  • 如果使用的是NTFS,则磁盘时间以UTC记录。这是非常需要的。
  • 如果您使用的是exFAT,则磁盘上的时间以本地日期+时间记录,但它还包括与UTC的偏移量,因此可以轻松地将其转换回UTC而不会产生歧义。
  • 如果您使用的是FAT或FAT32文件系统,则使用本地时间记录磁盘上的时间,该时间按写入文件时生效的时区进行。

    这会创建不明确的数据,因为您可能在daylight saving time后备过渡期间正在写入文件,或者您可能正在使用其他时区设置或完全在另一台计算机上读取数据。

    这是格式化可能用作exFAT而不是FAT32的任何USB拇指驱动器或SD卡的一个很好的理由。
  • 08-29 01:09