Ввод пользовательского аргумента даты Java

Я сейчас пишу Spigot/Craftbukkit plugin это будет управлять запретами. В одном методе у меня есть TempBan Command Executor, Моя цель состоит в том, чтобы пользователь указал продолжительность бана, используя собственный формат "стенограммы". Например: /tempban MyUser 5d2w My Reason"

Я хотел бы за строку 5d2w быть проанализирован и возвращен в миллисекундах. Я пытался сделать это сам, но это было ненадежно и поддерживал только один формат времени. Таким образом, вы не могли делать комбинации. Есть ли хороший эффективный способ использования JodaTime или же Java's default date format class чтобы сделать это? Спасибо!

1 ответ

Решение

ТЛ; др

Duration.parse( "PT1H30M" ).toMillis()

ISO 8601

Не нужно придумывать свой собственный сокращенный формат. Стандарт ISO 8601 уже определяет аналогичный формат для продолжительности.

Шаблон PnYnMnDTnHnMnS использует P чтобы отметить начало, T отделить любую часть лет-месяцев-дней от любой части часов-минут-секунд.

Примеры:

  • Полтора часа PT1H30M,
  • P3Y6M4D представляет "три года, шесть месяцев, четыре дня".

java.time

Классы java.time по умолчанию используют форматы ISO 8601 при разборе / генерации строк. Это включает в себя Period а также Duration классы для представления отрезков времени, не привязанных к временной шкале.

Duration

Duration d = Duration.ofHours( 1 ).plusMinutes( 30 );
String output = d.toString();

PT1H30M

И разбор.

Duration d2 = Duration.parse( "PT1H30M" );

Вы можете запросить продолжительность всего миллисекунды.

long millis = d2.toMillis();

5400000

Смотрите живой код в IdeOne.com.

Но помните, что классы java.time имеют более точное разрешение, наносекунды. Таким образом, вы можете потерять данные при запросе миллисекунд.

Кроме того, я настоятельно рекомендую вам использовать объекты java.time и строки ISO 8601 и избегать представления значений даты и времени в виде количества миллисекунд или около того.

Period

Для лет-месяцев-дней используйте Period учебный класс.

Period p = Period.parse( "P3Y6M4D" );

…а также…

String output = p.toString();

P3Y6M4D

Обратите внимание normalized метод на этом классе. Например, период "1 год и 15 месяцев" будет нормализован до "2 года и 3 месяца".

Также обратите внимание, что Period построен на LocalDate Информация. Как таковая, она не имеет понятия о часовых поясах и не имеет представления об аномалиях, таких как летнее время (DST).

Этот класс работает с разрешением целых дней. Таким образом, класс не предоставляет явный способ подсчета миллисекунд.


О java.time

Инфраструктура java.time встроена в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые классы даты и времени, такие как java.util.Date, Calendar & SimpleDateFormat,

Проект Joda-Time, находящийся сейчас в режиме обслуживания, рекомендует перейти на классы java.time.

Чтобы узнать больше, смотрите Oracle Tutorial. И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310.

Где взять классы java.time?

  • Java SE 8 и SE 9 и позже
    • Встроенный.
    • Часть стандартного Java API со встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и SE 7
    • Большая часть функциональности java.time перенесена на Java 6 и 7 в ThreeTen-Backport.
  • Android

Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Вы можете найти некоторые полезные классы здесь, такие как Interval, YearWeek, YearQuarter и многое другое.

Другие вопросы по тегам