Ввод пользовательского аргумента даты 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
- Проект ThreeTenABP адаптирует ThreeTen-Backport (упомянутый выше) специально для Android.
- Смотрите Как использовать ThreeTenABP….
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Вы можете найти некоторые полезные классы здесь, такие как Interval
, YearWeek
, YearQuarter
и многое другое.