Minitime
A Scala/Scala.js library which lets you operate on time and dates easily using +
, -
, *
, /
, >
, <
, to
, sortBy
, and more.
This library is a Scala wrapper around Java 8 Time API, with Scala.js implementation supported by scala-java-time.
Inspired by time for scala and chronoscala, I tried to provide additional features like time range (t1 to t2 by 3.hours
) and Ordering
typeclasses.
Installation
libraryDependencies += "net.pishen" %% "minitime" % "0.3.0"
// for Scala.js
libraryDependencies += "net.pishen" %%% "minitime" % "0.3.0"
Instantiation
import minitime._
val ld1 = LocalDate.now
val ld2 = LocalDate(2007, 8, 31)
val ld3 = LocalDate.parse("2018-03-09")
val ldt = LocalDateTime(2016, 7, 30, 19, 30, nano = 30000)
val lt = LocalTime.parse("12:35")
val zdt = ZonedDateTime.parse("2012-01-27T00:00:00.000000+09:00")
val d1: Duration = 1.hour
val d2: Duration = 2.minutes
val d3: Duration = 3.millis
val d4: Duration = Duration.parse("PT3S")
val p1: Period = 1.day
val p2: Period = 2.weeks
val p3: Period = 3.months
val p4: Period = Period(years = 1, months = 2, days = 3)
Basic Arithmetic
LocalDate(2018, 1, 31) + 1.day * 2
// 2018-02-02
LocalDate(2018, 4, 30) - 2.month
// 2018-02-28
LocalDateTime(2018, 8, 31, 23, 59) + 1.minute + 3.seconds
// 2018-09-01T00:00:03
LocalDate(2018, 3, 1) - LocalDate(2018, 2, 1)
// P28D
LocalDateTime.parse("2018-09-01T15:39:39") - LocalDateTime(2018, 8, 31, 0, 0)
// java.time.Duration = PT39H39M39S
3.minutes / 2 + 3.seconds * 3
// java.time.Duration = PT1M39S
Ordering
3.minutes < 3.hours
// true
LocalDate(2018, 3, 9) <= LocalDate(2017, 8, 31)
// false
Seq(1.hour, 2.minutes, 3.seconds).sorted
// List(PT3S, PT2M, PT1H)
Set(LocalDate(2018, 8, 29), LocalDate(2018, 8, 30), LocalDate(2018, 8, 31)).max
// 2018-08-31
Note that Ordering.Implicits.infixOrderingOps
is automatically imported to make the operations >
, <
, >=
, <=
, max
, min
available. If you don't want this feature or you met some ambiguous implicit conversions, remove the auto import using import minitime.{infixOrderingOps => _, _}
.
TimeRange
LocalDate.parse("2018-01-01") to LocalDate.parse("2018-01-05")
// TimeRange(2018-01-01, 2018-01-02, 2018-01-03, 2018-01-04, 2018-01-05)
LocalDate.parse("2018-01-01") till LocalDate.parse("2018-01-05")
// TimeRange(2018-01-01, 2018-01-02, 2018-01-03, 2018-01-04)
LocalDate.parse("2018-01-01") to LocalDate.parse("2018-01-05") by 2.days
// TimeRange(2018-01-01, 2018-01-03, 2018-01-05)
LocalDate.parse("2018-01-31") to LocalDate.parse("2018-05-01") by 1.month
// TimeRange(2018-01-31, 2018-02-28, 2018-03-31, 2018-04-30)
LocalDateTime.parse("2018-01-01T00:00:00") till LocalDateTime.parse("2018-01-01T00:00:03")
// TimeRange(2018-01-01T00:00, 2018-01-01T00:00:01, 2018-01-01T00:00:02)
LocalDateTime.parse("2018-01-01T00:00") to LocalDateTime.parse("2018-01-01T06:00") by 2.hour
// TimeRange(2018-01-01T00:00, 2018-01-01T02:00, 2018-01-01T04:00, 2018-01-01T06:00)
TimeRange[T]
extends Seq[T]
, with a constant time apply()
and linear time length()
.