Входной аргумент Java Custom Date

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

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

Ответ 1

TL;DR

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

ISO 8601

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

В шаблоне PnYnMnDTnHnMnS используется P, чтобы отметить начало, a 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 месяцев".

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

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


О java.time

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

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

Чтобы узнать больше, см. Учебник Oracle. И поиск Qaru для многих примеров и объяснений. Спецификация 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 и больше.