Skip to content

Commit

Permalink
Add Date & Calendar extensions (#26)
Browse files Browse the repository at this point in the history
  • Loading branch information
seljabali committed Feb 8, 2024
1 parent 8eabe7c commit d37f8e4
Show file tree
Hide file tree
Showing 11 changed files with 101 additions and 91 deletions.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,9 @@ val result = "2021-06-07".parseZonedDateTime()
```kotlin
val result = ZonedDateTimeUtil.new(year = 2021, month = 3, day = 25)

val result = LocalDateTimeUtil.new(Date())
val result = Date().toLocalDateTime()

val result = LocalDateUtil.new(GregorianCalendar())
val result = GregorianCalendar().toLocalDate()

val result = LocalTimeUtil.new(hour = 5, minute = 30)
```
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package javatimefun.calendar.extensions

import javatimefun.localdate.LocalDateUtil
import javatimefun.localdatetime.LocalDateTimeUtil
import javatimefun.localtime.LocalTimeUtil
import java.time.*
import java.util.Calendar

/**
* @param useSystemTimeZone If true, converts to time zone of the device, else leaves as is on calendar.
* @return ZonedDateTime.
*/
fun Calendar.toZonedDateTime(): ZonedDateTime =
ZonedDateTime.ofInstant(this.toInstant(), ZoneId.of(this.timeZone.id))

fun Calendar.toLocalDateTime(): LocalDateTime =
LocalDateTimeUtil.new(this.toInstant().toEpochMilli())

fun Calendar.toLocalDate(): LocalDate =
LocalDateUtil.new(this.toInstant().toEpochMilli())

fun Calendar.toLocalTime(): LocalTime =
LocalTimeUtil.new(this.toInstant().toEpochMilli())
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package javatimefun.date.extensions

import javatimefun.localdate.LocalDateUtil
import javatimefun.localdatetime.LocalDateTimeUtil
import javatimefun.localtime.LocalTimeUtil
import javatimefun.zoneddatetime.ZonedDateTimeUtil
import java.time.LocalDate
import java.time.LocalDateTime
import java.time.LocalTime
import java.time.ZonedDateTime
import java.util.Date

/**
* @param useSystemTimeZone If true, converts to time zone of the device, else leaves as UTC.
* @return ZonedDateTime.
*/
fun Date.toZonedDateTime(useSystemTimeZone: Boolean = true): ZonedDateTime =
ZonedDateTimeUtil.new(this.toInstant().toEpochMilli(), useSystemTimeZone)

/**
* @return LocalDateTime.
*/
fun Date.toLocalDateTime(): LocalDateTime =
LocalDateTimeUtil.new(this.toInstant().toEpochMilli())

/**
* @return LocalDate.
*/
fun Date.toLocalDate(): LocalDate =
LocalDateUtil.new(this.toInstant().toEpochMilli())

/**
* @return LocalTime.
*/
fun Date.toLocalTime(): LocalTime =
LocalTimeUtil.new(this.toInstant().toEpochMilli())
17 changes: 2 additions & 15 deletions src/main/kotlin/javatimefun/localdate/LocalDateUtil.kt
Original file line number Diff line number Diff line change
Expand Up @@ -23,19 +23,6 @@ object LocalDateUtil {
* @param epochMilliseconds Epoch time, aka Unix time, are seconds elapsed since January 1st 1970 at 00:00:00 UTC.
* @return LocalDate.
*/
fun new(epochMilliseconds: Long): LocalDate = LocalDate.ofEpochDay(epochMilliseconds / 1000 / 60 / 60 / 24)

/**
* @param date A wrapper of Epoch time in UTC.
* @return LocalDate.
*/
fun new(date: Date): LocalDate =
javatimefun.localdate.LocalDateUtil.new(date.toInstant().toEpochMilli())

/**
* @param calendar Calendar, a date time variable that supports time zones.
* @return LocalDate.
*/
fun new(calendar: Calendar): LocalDate =
javatimefun.localdate.LocalDateUtil.new(calendar.toInstant().toEpochMilli())
fun new(epochMilliseconds: Long): LocalDate =
LocalDate.ofEpochDay(epochMilliseconds / 1000 / 60 / 60 / 24)
}
23 changes: 6 additions & 17 deletions src/main/kotlin/javatimefun/localdatetime/LocalDateTimeUtil.kt
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
package javatimefun.localdatetime

import javatimefun.date.extensions.toLocalDateTime
import java.time.Instant
import java.time.LocalDateTime
import java.time.Month
import java.time.ZoneId
import java.util.Calendar
import java.time.ZoneOffset
import java.util.Date

/**
Expand Down Expand Up @@ -58,21 +59,9 @@ object LocalDateTimeUtil {
* @param epochMilliseconds Epoch time, aka Unix time, are seconds elapsed since January 1st 1970 at 00:00:00 UTC.
* @return LocalDateTime.
*/
fun new(epochMilliseconds: Long): LocalDateTime = new(Date(epochMilliseconds))

/**
* @param date A wrapper of Epoch time in UTC.
* @return LocalDateTime.
*/
fun new(date: Date): LocalDateTime = LocalDateTime.ofInstant(date.toInstant(), ZoneId.of("UTC"))

/**
* @param calendar Calendar, a date time variable that supports time zones.
* @return LocalDateTime.
*/
fun new(calendar: Calendar, useSystemTimeZone: Boolean = true): LocalDateTime =
fun new(epochMilliseconds: Long): LocalDateTime =
LocalDateTime.ofInstant(
calendar.toInstant(),
if (useSystemTimeZone) ZoneId.systemDefault() else ZoneId.of("UTC")
Instant.ofEpochMilli(epochMilliseconds),
ZoneOffset.UTC
)
}
25 changes: 9 additions & 16 deletions src/main/kotlin/javatimefun/localtime/LocalTimeUtil.kt
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package javatimefun.localtime

import javatimefun.localdatetime.LocalDateTimeUtil
import java.time.Instant
import java.time.LocalDateTime
import java.time.LocalTime
import java.util.Date
import java.util.Calendar
import java.time.ZoneOffset

/**
* Contains helper functions that only serve to create new LocalTimes.
Expand Down Expand Up @@ -48,17 +48,10 @@ object LocalTimeUtil {
* @param epochMilliseconds Epoch time, aka Unix time, are seconds elapsed since January 1st 1970 at 00:00:00 UTC.
* @return LocalTime.
*/
fun new(epochMilliseconds: Long): LocalTime = LocalDateTimeUtil.new(epochMilliseconds).toLocalTime()

/**
* @param date A wrapper of Epoch time in UTC.
* @return LocalTime.
*/
fun new(date: Date): LocalTime = LocalDateTimeUtil.new(date).toLocalTime()

/**
* @param calendar Calendar, a date time variable that supports time zones.
* @return LocalTime.
*/
fun new(calendar: Calendar): LocalTime = LocalDateTimeUtil.new(calendar, useSystemTimeZone = false).toLocalTime()
fun new(epochMilliseconds: Long): LocalTime =
LocalDateTime.ofInstant(
Instant.ofEpochMilli(epochMilliseconds),
ZoneOffset.UTC
)
.toLocalTime()
}
43 changes: 9 additions & 34 deletions src/main/kotlin/javatimefun/zoneddatetime/ZonedDateTimeUtil.kt
Original file line number Diff line number Diff line change
@@ -1,21 +1,13 @@
package javatimefun.zoneddatetime

import java.time.Instant
import java.time.LocalDateTime
import java.time.Month
import java.time.ZoneId
import java.time.ZonedDateTime
import java.util.Calendar
import java.util.Date
import java.time.*

/**
* Contains helper functions that only serve to create new ZonedDateTimes.
* Creation methods do not include parsing methods.
*/
object ZonedDateTimeUtil {

private val UTC get() = ZoneId.of("UTC")

/**
* @param year Year, ie, 2020.
* @param month Month with range 1-12, i.e. 1 for January.
Expand All @@ -38,7 +30,10 @@ object ZonedDateTimeUtil {
useSystemTimeZone: Boolean = true
): ZonedDateTime {
val localDateTime = LocalDateTime.of(year, Month.of(month), day, hourIn24, minute, second, nano)
return ZonedDateTime.of(localDateTime, if (useSystemTimeZone) ZoneId.systemDefault() else UTC)
return ZonedDateTime.of(
localDateTime,
if (useSystemTimeZone) ZoneId.systemDefault() else ZoneOffset.UTC
)
}

/**
Expand Down Expand Up @@ -71,28 +66,8 @@ object ZonedDateTimeUtil {
* @return ZonedDateTime.
*/
fun new(epochMilliseconds: Long, useSystemTimeZone: Boolean = true): ZonedDateTime =
getZonedDateTimeFromInstant(Instant.ofEpochMilli(epochMilliseconds), useSystemTimeZone)

/**
* @param date A wrapper of Epoch time in UTC.
* @param useSystemTimeZone If true, converts to time zone of the device, else leaves as UTC.
* @return ZonedDateTime.
*/
fun new(date: Date, useSystemTimeZone: Boolean = true): ZonedDateTime =
getZonedDateTimeFromInstant(date.toInstant(), useSystemTimeZone)

/**
* @param calendar Calendar, a date time variable that supports time zones.
* @param useSystemTimeZone If true, converts to time zone of the device, else leaves as is on calendar.
* @return ZonedDateTime.
*/
fun new(calendar: Calendar, useSystemTimeZone: Boolean = true): ZonedDateTime {
if (useSystemTimeZone) {
return getZonedDateTimeFromInstant(calendar.toInstant(), true)
}
return ZonedDateTime.ofInstant(calendar.toInstant(), ZoneId.of(calendar.timeZone.id))
}

private fun getZonedDateTimeFromInstant(instant: Instant, useSystemTimeZone: Boolean): ZonedDateTime =
ZonedDateTime.ofInstant(instant, if (useSystemTimeZone) ZoneId.systemDefault() else UTC)
ZonedDateTime.ofInstant(
Instant.ofEpochMilli(epochMilliseconds),
if (useSystemTimeZone) ZoneId.systemDefault() else ZoneOffset.UTC
)
}
6 changes: 4 additions & 2 deletions src/test/kotlin/localdate/LocalDateUtilTest.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package localdate

import javatimefun.calendar.extensions.toLocalDate
import javatimefun.date.extensions.toLocalDate
import javatimefun.localdate.extensions.getMonthBaseZero
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test
Expand Down Expand Up @@ -31,7 +33,7 @@ class LocalDateUtilTest {

// when
val date = Date(epoch)
val localDate = javatimefun.localdate.LocalDateUtil.new(date)
val localDate = date.toLocalDate()

// then
assertEquals(2011, localDate.year)
Expand All @@ -50,7 +52,7 @@ class LocalDateUtilTest {
timeZone = TimeZone.getTimeZone("UTC")
time = date
}
val localDate = javatimefun.localdate.LocalDateUtil.new(calendar)
val localDate = calendar.toLocalDate()

// then
assertEquals(calendar[Calendar.YEAR], localDate.year)
Expand Down
6 changes: 4 additions & 2 deletions src/test/kotlin/localdatetime/LocalDateTimeUtilTest.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package localdatetime

import javatimefun.calendar.extensions.toLocalDateTime
import javatimefun.date.extensions.toLocalDateTime
import javatimefun.localdatetime.LocalDateTimeUtil
import javatimefun.localdatetime.extensions.getMonthBaseZero
import org.junit.jupiter.api.Assertions.assertEquals
Expand Down Expand Up @@ -35,7 +37,7 @@ class LocalDateTimeUtilTest {

// when
val date = Date(epoch)
val localDateTime = LocalDateTimeUtil.new(date)
val localDateTime = date.toLocalDateTime()

// then
assertEquals(2011, localDateTime.year)
Expand All @@ -57,7 +59,7 @@ class LocalDateTimeUtilTest {
timeZone = TimeZone.getTimeZone("UTC")
time = date
}
val localDateTime = LocalDateTimeUtil.new(calendar, useSystemTimeZone = false)
val localDateTime = calendar.toLocalDateTime()

// then
assertEquals(2011, localDateTime.year)
Expand Down
6 changes: 4 additions & 2 deletions src/test/kotlin/localtime/LocalTimeUtilTest.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package localtime

import javatimefun.calendar.extensions.toLocalTime
import javatimefun.date.extensions.toLocalTime
import javatimefun.localtime.LocalTimeUtil
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test
Expand Down Expand Up @@ -31,7 +33,7 @@ class LocalTimeUtilTest {

// when
val date = Date(epoch)
val localTime = LocalTimeUtil.new(date)
val localTime = date.toLocalTime()

// then
assertEquals(5, localTime.hour)
Expand All @@ -50,7 +52,7 @@ class LocalTimeUtilTest {
timeZone = TimeZone.getTimeZone("UTC")
time = date
}
val localTime = LocalTimeUtil.new(calendar)
val localTime = calendar.toLocalTime()

// then
assertEquals(5, localTime.hour)
Expand Down
3 changes: 2 additions & 1 deletion src/test/kotlin/zoneddatetime/ZonedDateTimeUtilTest.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package zoneddatetime

import javatimefun.calendar.extensions.toZonedDateTime
import javatimefun.zoneddatetime.ZonedDateTimeUtil
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test
Expand Down Expand Up @@ -149,7 +150,7 @@ class ZonedDateTimeTest {
timeZone = TimeZone.getTimeZone(timeZoneId)
set(year, month, day, hour, minute, second)
}
val zonedDateTime = ZonedDateTimeUtil.new(calendar, useSystemTimeZone = false)
val zonedDateTime = calendar.toZonedDateTime()

// then
assertEquals(calendar.timeZone.id, zonedDateTime.zone.id)
Expand Down

0 comments on commit d37f8e4

Please sign in to comment.