aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/xyz/driver/core/date.scala
blob: 05d139d95f18d9b32ea21fedf86ecfdfa13ca192 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package xyz.driver.core

import java.util.Calendar

import scalaz.{@@, Tag}

object date {

  type Month = Int @@ Month.type
  private[date] def tagMonth(value: Int): Month = Tag.of[Month.type](value)

  object Month {
    val JANUARY   = tagMonth(Calendar.JANUARY)
    val FEBRUARY  = tagMonth(Calendar.FEBRUARY)
    val MARCH     = tagMonth(Calendar.MARCH)
    val APRIL     = tagMonth(Calendar.APRIL)
    val MAY       = tagMonth(Calendar.MAY)
    val JUNE      = tagMonth(Calendar.JUNE)
    val JULY      = tagMonth(Calendar.JULY)
    val AUGUST    = tagMonth(Calendar.AUGUST)
    val SEPTEMBER = tagMonth(Calendar.SEPTEMBER)
    val OCTOBER   = tagMonth(Calendar.OCTOBER)
    val DECEMBER  = tagMonth(Calendar.DECEMBER)
  }

  final case class Date(year: Int, month: Month, day: Int) {
    def iso8601: String = f"$year%04d-${Tag.unwrap(month) + 1}%02d-$day%02d"
    def toJavaSqlDate = new java.sql.Date(toJavaDate.getTime)
    def toJavaDate: java.util.Date = {
      val cal = Calendar.getInstance()
      cal.set(Calendar.YEAR, year - 1900)
      cal.set(Calendar.MONTH, Tag.unwrap(month))
      cal.set(Calendar.DAY_OF_MONTH, day)
      cal.getTime
    }
  }

  object Date {
    def fromJavaDate(date: java.util.Date) = {
      val cal = Calendar.getInstance()
      cal.setTime(date)
      Date(cal.get(Calendar.YEAR), tagMonth(cal.get(Calendar.MONTH)), cal.get(Calendar.DAY_OF_MONTH))
    }
  }
}