2014-04-16 60 views
5

我有DateTime需要轉換爲NodaTime LocalDate。這可以做到嗎?DateTime到LocalDate(NodaTime)

我有這樣的:

DateTime modifiedDate = File.GetLastWriteTime(file); 

而且我想這一點:

LocalTime modifiedDate = File.GetLastWriteTime(file); 

但它看起來像NodaTimeAPI不能從GetLastWriteTime得到的日期值。

所以我要麼需要 一)轉換日期時間到本地時間或 B)以某種方式使用本地時間從GetLastWriteTime

+0

您是指LocalTime或LocalDate?你在你的問題中指定。有'LocalDateTime.FromDateTime()'存在,這可以幫助你嗎? –

+0

你說它無法獲得價值。但是什麼是例外? – mason

回答

8

一個野田時間的原則設計決策的獲取日期值,是應該有沒有計算機本地時區設置產生的副作用。在內部,GetLastWriteTime調用GetLastWriteTimeUtc().ToLocalTime()。所以只要撥打GetLastWriteTime,你就違反了這個理想。

正確的Noda時間類型讀取文件時間將是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 thumbdrive或SD卡的很好的理由。

+1

這似乎非常複雜 – NimChimpsky

+0

@NimChimpsky - 哪一部分?謹慎澄清? –

+0

爲了得到本地日期在noda時間的今天的日期,我必須做類似的代碼(?)。而在java喬達時間,我只是實例化一個新的localdate()沒有參數。 – NimChimpsky