【问题标题】:DateTime to LocalDate (NodaTime)日期时间到本地日期 (NodaTime)
【发布时间】:2014-05-31 21:52:14
【问题描述】:

我有一个DateTime,需要转换为NodaTime LocalDate。这个可以吗?

我有这个:

 DateTime modifiedDate = File.GetLastWriteTime(file);

我想要这个:

LocalTime modifiedDate = File.GetLastWriteTime(file);

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

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

【问题讨论】:

  • 您是指 LocalTime 还是 LocalDate?您在问题中都指定了两者。存在LocalDateTime.FromDateTime(),这对您有帮助吗?
  • 你说它不能取值。但是有什么例外呢?

标签: c# datetime localtime nodatime


【解决方案1】:

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 卡的好理由。

【讨论】:

  • 这看起来非常复杂
  • @NimChimpsky - 哪一部分?想澄清一下吗?
  • 要在 noda-time 中获取带有今天日期的 localdate,我必须执行类似的代码 (?)。而在 java joda-time 中,我只是实例化一个没有 args 的新 localdate()。
  • 明白。但这是the Noda Time design philosophy 的一部分。我相信在the Noda Time Google Group 上会欢迎对此进行一些辩论。
  • 啊,我希望我弄错了。好的,谢谢。
猜你喜欢
  • 2012-10-29
  • 1970-01-01
  • 2018-10-28
  • 1970-01-01
  • 1970-01-01
  • 2015-05-10
  • 2012-10-07
  • 1970-01-01
  • 2021-06-29
相关资源
最近更新 更多