DateTime в LocalDate (NodaTime)

У меня есть DateTime, который нужно преобразовать в NodaTime LocalDate. Можно ли это сделать?

У меня есть это:

 DateTime modifiedDate = File.GetLastWriteTime(file);

И я хочу это:

LocalTime modifiedDate = File.GetLastWriteTime(file);

Но похоже, что NodaTime API не может получить значение даты из GetLastWriteTime.

Поэтому мне нужно либо а) преобразовать DateTime в LocalTime, либо б) каким-то образом использовать LocalTime, чтобы получить значение даты из GetLastWriteTime


person user2475310    schedule 16.04.2014    source источник
comment
Вы имеете в виду LocalTime или LocalDate? Вы указываете оба в своем вопросе. Существует LocalDateTime.FromDateTime(), это может вам помочь?   -  person Marcel Gosselin    schedule 17.04.2014
comment
Вы говорите, что он не может получить значение. Но что является исключением?   -  person mason    schedule 17.04.2014


Ответы (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, время на диске записывается с использованием местного времени по часовому поясу, действующему на момент записи файла.

    Это создает неоднозначные данные, так как вы можете записывать в файл во время перехода на летнее время или вы можете считывать данные, используя другую настройку часового пояса или полностью другой компьютер.

    Это хорошая причина отформатировать любой USB-накопитель или SD-карты, которые вы можете использовать, в exFAT вместо FAT32.

person Matt Johnson-Pint    schedule 18.04.2014
comment
это кажется безумно сложным - person NimChimpsky; 18.06.2014
comment
@NimChimpsky - Какая часть? Хотите уточнить? - person Matt Johnson-Pint; 18.06.2014
comment
Чтобы получить локальную дату с сегодняшней датой в узловом времени, мне нужно сделать аналогичный код (?). В то время как в java joda-time я просто создаю новый экземпляр localdate() без аргументов. - person NimChimpsky; 19.06.2014
comment
Понял. Но это часть философии дизайна Noda Time. Я уверен, что обсуждение этого вопроса будет приветствоваться в группе Google Noda Time. - person Matt Johnson-Pint; 19.06.2014
comment
А, я надеялся, что как-то ошибся. Хорошо спасибо. - person NimChimpsky; 19.06.2014