Одно из принципиальных дизайнерских решений 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, время на диске записывается с использованием местного времени по часовому поясу, действующему на момент записи файла.
Это создает неоднозначные данные, так как вы можете записывать в файл во время перехода на летнее время или вы можете считывать данные, используя другую настройку часового пояса или полностью другой компьютер.
Это хорошая причина отформатировать любой USB-накопитель или SD-карты, которые вы можете использовать, в exFAT вместо FAT32.
person
Matt Johnson-Pint
schedule
18.04.2014
LocalDateTime.FromDateTime()
, это может вам помочь? - person Marcel Gosselin   schedule 17.04.2014