首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DateTime to LocalDate (NodaTime)

DateTime to LocalDate (NodaTime)
EN

Stack Overflow用户
提问于 2014-04-16 20:20:13
回答 1查看 7.9K关注 0票数 5

我有一个需要转换为DateTimeNodaTime LocalDate。这能办到吗?

我有这个:

代码语言:javascript
复制
 DateTime modifiedDate = File.GetLastWriteTime(file);

我想要这个:

代码语言:javascript
复制
LocalTime modifiedDate = File.GetLastWriteTime(file);

但是NodaTime API似乎无法从GetLastWriteTime获得日期值。

因此,我要么需要( a)将DateTime转换为LocalTime,要么( b)以某种方式使用LocalTime从GetLastWriteTime获取日期值。

EN

回答 1

Stack Overflow用户

发布于 2014-04-18 16:14:04

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

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

代码语言:javascript
复制
Instant instant = Instant.FromDateTimeUtc(File.GetLastWriteTimeUtc(file));

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

首先,决定你想要的时区。例如:

代码语言:javascript
复制
DateTimeZone zone = DateTimeZoneProviders.Tzdb["America/New_York"];

如果出于某种原因要使用计算机自己的本地时区,请使用以下命令:

代码语言:javascript
复制
DateTimeZone zone = DateTimeZoneProviders.Tzdb.GetSystemDefault();

然后将时区应用于文件时间的瞬间:

代码语言:javascript
复制
ZonedDateTime zonedDateTime = instant.InZone(zone);

然后,您可以从其中任何一个中选择,具体取决于您要寻找的是什么:

代码语言:javascript
复制
LocalDateTime localDateTime = zonedDateTime.LocalDateTime;
LocalDate date = zonedDateTime.Date;
LocalTime time = zonedDateTime.TimeOfDay;

另外,您应该了解,在磁盘上,文件时间取决于您正在使用的文件系统的类型。

  • 如果您正在使用NTFS,磁盘上的时间将记录在UTC中。这是极受欢迎的。
  • 如果您正在使用exFAT,磁盘上的时间是以本地日期+时间记录的,但它也包含来自UTC的偏移量,因此很容易将其转换回UTC,而不会产生歧义。
  • 如果您使用的是FAT或FAT32文件系统,则磁盘上的时间将使用本地时间记录,由写入文件时有效的时区记录。 这会创建不明确的数据,因为您可能在daylight saving time回退转换期间写入文件,或者使用不同的时区设置或使用完全不同的计算机读取数据。 这是一个很好的理由来格式化任何USB拇指驱动器或SD卡,您可能使用作为exFAT而不是FAT32。
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23119358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档