Как получить самый низкий хронограф из формата даты? - PullRequest
4 голосов
/ 16 июня 2020

Взгляните на примеры:

yyyy-MM-dd -> java.time.temporal.ChronoUnit.DAYS
yyyy-MM-dd HH -> java.time.temporal.ChronoUnit.HOURS
yyyy;HH;ss -> java.time.temporal.ChronoUnit.SECONDS
yyyy;dd;MM -> java.time.temporal.ChronoUnit.DAYS

есть ли API для извлечения наименьшей единицы хронографа из формата строки даты и времени?

1 Ответ

4 голосов
/ 16 июня 2020

Вы можете попытаться проанализировать заданную дату и проверить, какие единицы имеют значения. Ниже я написал быстрый пример, который выводит:

yyyy-MM-dd Days
yyyy-MM-dd HH Hours
yyyy; HH; ss Seconds
yyyy; dd; MM ss n Nanos

Примечания:

  • он основан на том факте, что единицы находятся в порядке возрастания в перечислении ChronoField.
  • it будет работать для встроенных единиц измерения (год, месяц, день, секунда, нано), но может не дать желаемого результата для других полей, таких как, например, недельные поля или поля милли / микросекунд.
public static void main(String[] args) {
    String[] formats = { "yyyy-MM-dd", "yyyy-MM-dd HH", "yyyy;HH;ss", "yyyy;dd;MM ss n" };
    LocalDateTime test = LocalDateTime.of(1, 1, 1, 1, 1, 1, 1);

    for (String f : formats) {
        DateTimeFormatter format = DateTimeFormatter.ofPattern(f);
        TemporalAccessor accessor = format.parse(test.format(format));
        for (ChronoField unit : ChronoField.values()) {
            if (testUnit(accessor, unit)) {
                System.out.println(f + " " + unit.getBaseUnit());
                break;
            }
        }
    }
}

private static boolean testUnit(TemporalAccessor accessor, ChronoField unit) {
    return accessor.isSupported(unit) && accessor.getLong(unit) == 1;
}
...