DateTime到LocalDate(NodaTime)

时间:2014-04-16 20:20:13

标签: c# datetime localtime nodatime

我有DateTime需要转换为NodaTime LocalDate。可以这样做吗?

我有这个:

 DateTime modifiedDate = File.GetLastWriteTime(file);

我想要这个:

LocalTime modifiedDate = File.GetLastWriteTime(file);

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

所以我要么 a)将DateTime转换为LocalTime或 b)以某种方式使用LocalTime从GetLastWriteTime

获取日期值

1 个答案:

答案 0 :(得分:8)

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而不会产生歧义。

    < / LI>
  • 如果您正在使用FAT或FAT32文件系统,则使用本地时间记录磁盘上的时间,以及写入文件时生效的时区

    这会产生不明确的数据,因为您可能在daylight saving time后退转换期间写入文件,或者您可能正在使用不同的时区设置或完全不同的计算机读取数据。

    这是格式化任何可能用作exFAT而不是FAT32的USB拇指驱动器或SD卡的理由。