Kotlin extensions to the java8 time library
Int
, Long
and Double
values can be suffixed with a time unit to create a Duration
val delay = 30.seconds // equal to Duration.ofSeconds(30)
val longDelay = 2.5.minutes // equal to Duration.ofSeconds(150)
Available Duration
suffixes: nanos
, micros
, millis
, seconds
, minutes
, hours
Int
and Long
values can be suffixed with a date unit to create a Period
val interval = 30L.days
Available Period
suffixes: days
, weeks
, months
, years
val duration = 2.hours + 30.minutes
val period = 2.months + 14.days
val duration = 1.hours - 1.minutes
val negativeDuration = -30.seconds
val fullDuration = 2.5.hours
val doubledDuration = 2.5.hours * 2
val halfDuration = 2.5.hours / 2
Note that Period
is not Comparable
1.hours > 1.minutes
1000.nanos == 1.micros
val (sec, nano) = 2.5.seconds
val (y, m, d) = 1.years + 2.months + 3.days
These produce an OffsetDateTime
with a UTC offset:
val lastHour = 1.hours.ago
val thisTimeTomorrow = 1.days.fromNow
val startTime = 30.seconds.fromNow
val stopTime = startTime + 1.minutes // add Durations & Periods to dates & times
Most TemporalQueries involve extracting a data type that contains a subset of the data for the current data type. For example, you can go from OffsetDateTime to LocalDateTime, but not vice-versa because LocalDateTime doesn't have zoneOffset.
val thisYear: Year = 0.seconds.ago.year
val thisMonth: Month = 0.seconds.ago.month
val dayOfWeek: DayOfWeek = 0.seconds.ago.dayOfWeek
val currentTime: localTime = 0.seconds.ago.localTime
val startOfThisMonth = 0.seconds.ago.atStartOfThisMonth
val startOfNextMonth = 0.seconds.ago.atStartOfNextMonth
val endOfThisMonth = 0.seconds.ago.atEndOfThisMonth
val startOfThisYear = 0.seconds.ago.atStartOfThisYear
val startOfNextYear = 0.seconds.ago.atStartOfNextYear
val endOfThisYear = 0.seconds.ago.atEndOfThisYear
Although java 8's time library doesn't support the idea of a Range, this library does. In addition to offering a step
modifier, these
ranges also offer a unit
modifier. The unit modifier is used to specify the unit (MINUTES
, DAYS
, etc.) to use if you iterate over
the range. If no unit is specified, the native precision is used (e.g. the native precision for a date is DAYS
, the native precision for
DateTimes is NANOS
)
Inclusive ranges
(2010.asYear..2020.asYear).count() // should be equal to 11
val inOfferPeriod = 0.seconds.ago in offer.start..offer.end
for (d in date1..date2) {...}
for (d in time1..time2 step 10 unit MINUTES) {...}
for (d in dateTime1..dateTime2 unit DAYS) {...}
Exclusive ranges
(2010.asYear until 2020.asYear).count() // should be equal to 10
for (d in date1 until date2) {...}
for (d in time1 until time2 step 10 unit MINUTES) {...}
for (d in dateTime1 until dateTime2 unit DAYS) {...}