вычитание / сложение времени из йода Продолжительность - PullRequest
0 голосов
/ 11 июня 2018

Например, мне известны методы .minusDays(int) и .plus(int) в классе DateTime joda.

Но когда я работаю с joda Duration, без привязки к конкретному моменту времени, существует ли простой и приятный способ вычесть или добавить определенное количество времени, например, день?

Что-то вроде:

new Duration(startTime, endTime).minusDays(2);

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

tl; др

Joda-Time предлагает методы Duration::plus & Duration::minus.

myDuration.minus(                // A span of time unattached to the timeline. Consists of a number of milliseconds.
    Duration.standardDays( 2 )   // Generic 24-hour days.
)

Лучше перейти на java.time :

myDuration.minus(                // A span of time unattached to the timeline. Consists of a number of whole seconds plus a number of nanoseconds.
    Duration.ofDays( 2 )         // Generic 24-hour days.
)

Нет такой вещи, как days

Duration (startTime, endTime) .minusDays (2)

A Duration в Joda-Time представляет количество миллисекунд.Этот промежуток времени не привязан к временной шкале.Таким образом, нет понятия «дни».

Цитировать документацию :

Неизменная длительность, определяющая продолжительность в миллисекундах.

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

Поэтому, хотя вы не можете добавлять / вычитать дней , вы можете добавлять / вычитатьколичество миллисекунд - это 24-часовой период общего дня, без учета проблем календаря и без учета аномалий, таких как переход на летнее время (DST).

Используйте java.util.concurrent.TimeUnit перечисление для вычисления этого количества миллисекунд.

long millis = TimeUnit.DAYS.toMilliseconds( 2 ) ; // 2 days of 24 hours * 60 minutes per hour * 60 seconds per minute * 1,000 milliseconds per second.

Duration twoGenericDays = Duration.millis( millis ) ;

Класс Duration предлагает ярлык для этой работы, статический метод Duration.standardDays, где «стандарт» означает общие 24-часовые фрагменты временине имеет отношения к календарю.

Duration twoGenericDays = Duration.standardDays( 2 ) ;  // Two generic 24-hour days, unrelated to the calendar.

Доп.

Duration d = myDuration.plus( twoGenericDays ) ;

Вычитание.

Duration d = myDuration.minus( twoGenericDays ) ;

java.time

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

Те же концепции, что и выше, где java.time.Duration представляет промежуток времени, не привязанный к временной шкале.За исключением того, что разрешение меньше: наносекунд , а не миллисекунд .Технически, Duration состоит из (a) количества целых секунд и (b) количества наносекунд, составляющих доли секунды.

Duration twoGenericDays = Duration.ofDays( 2 ) ;  // Two generic days, each being a 24 hours long.

Add.

Duration d = myDuration.plus( twoGenericDays ) ;

Вычтите.

Duration d = myDuration.minus( twoGenericDays ) ;

Как и Joda-Time, классы java.time построены по шаблону неизменных объектов .Вместо того, чтобы изменять («изменять») объект, создается новый отдельный объект.


О java.time

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

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

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

Вы можете обмениваться java.time объектами напрямую с вашей базой данных.Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии.Нет необходимости в строках, нет необходимости в java.sql.* классах.

Где получить классы java.time?

  • Java SE 8 , Java SE 9 , Java SE 10, а позже
    • Встроенный.
    • Часть стандартного Java API с встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функций java.time перенесена на Java 6 & 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии реализации комплекта Android классов java.time.
    • Для более ранних версий Android (<26) проект <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP адаптируется ThreeTen-Backport (упомянуто выше).См. Как использовать ThreeTenABP… .

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

0 голосов
/ 11 июня 2018

Умничая с вызовами API (например, используя Duration#withDurationAdded), выглядит , что вы можете вычесть день из Duration, при условии, что это "стандарт""день (86 400 секунд в день) и до тех пор, пока вы задаете скалярную операцию отрицательной.

new Duration(start, end).withDurationAdded(Duration.standardDays(1), -1);
...