Skip to content

Commit e32234b

Browse files
authored
date time kotlinx (#1074)
* date time kotlinx * resolve PR comments * fix imports * functions refactoring * refactor test * assert changes * change logger to assert
1 parent b4d7a40 commit e32234b

File tree

3 files changed

+255
-1
lines changed

3 files changed

+255
-1
lines changed

core-kotlin-modules/core-kotlin-date-time/pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828

2929
<properties>
3030
<joda-time.version>2.12.1</joda-time.version>
31-
<kotlinx-datetime.version>0.4.0</kotlinx-datetime.version>
31+
<kotlinx-datetime.version>0.6.0</kotlinx-datetime.version>
3232
</properties>
3333

3434
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
package com.baeldung.dates.kotlinxDatetime
2+
3+
import kotlinx.datetime.*
4+
import kotlinx.datetime.format.DateTimeFormat
5+
import kotlinx.datetime.format.char
6+
import org.slf4j.LoggerFactory
7+
8+
class KotlinxDateTimeOperations {
9+
10+
val logger = LoggerFactory.getLogger(KotlinxDateTimeOperations::class.java)
11+
12+
fun getInstant(): Instant {
13+
val instant = Clock.System.now()
14+
logger.info(instant.toString())
15+
return instant
16+
}
17+
18+
fun getLocalDateTimeBrazilTimeZoneFromInstant(instant: Instant): LocalDateTime {
19+
val timeZoneFromString = TimeZone.of("Brazil/East")
20+
val localDateTimeBrazil = instant.toLocalDateTime(timeZoneFromString)
21+
logger.info(localDateTimeBrazil.toString())
22+
return localDateTimeBrazil
23+
}
24+
25+
fun getLocalDateTimeUtcMinus3TimeZoneFromInstant(instant: Instant): LocalDateTime {
26+
val timeZoneFromUTCString = TimeZone.of("UTC-3")
27+
val localDateUtcMinus3 = instant.toLocalDateTime(timeZoneFromUTCString)
28+
logger.info(localDateUtcMinus3.toString())
29+
return localDateUtcMinus3
30+
}
31+
32+
fun createLocalDateTime(): LocalDateTime {
33+
val localDateTime = LocalDateTime(year = 2024, month = Month.JULY, dayOfMonth = 31, hour = 11, minute = 10, second = 0, nanosecond = 0)
34+
return localDateTime
35+
}
36+
37+
fun getLocalDate(): LocalDate {
38+
val localDate = LocalDate(year = 2024, month = Month.JULY, dayOfMonth = 31)
39+
return localDate
40+
}
41+
42+
fun convertInstantToLocalDate(instant: Instant): LocalDate {
43+
val localDate = instant.toLocalDateTime(TimeZone.currentSystemDefault()).date
44+
return localDate
45+
}
46+
47+
fun getLocalTime(): LocalTime {
48+
val hourMinute = LocalTime(hour = 10, minute = 30)
49+
val localTimeSeconds = LocalTime(hour = 10, minute = 30, second = 15)
50+
val localTimeNanoseconds = LocalTime(hour = 10, minute = 30, second = 15, nanosecond = 50)
51+
return hourMinute
52+
}
53+
54+
fun convertInstantToLocalTime(instant: Instant): LocalTime {
55+
val localTime = instant.toLocalDateTime(TimeZone.currentSystemDefault()).time
56+
return localTime
57+
}
58+
59+
fun compareInstantAndEpochMilliseconds(): Long {
60+
val instant = Instant.fromEpochMilliseconds(epochMilliseconds = 1722475458286)
61+
val epochMilliseconds = instant.toEpochMilliseconds()
62+
return epochMilliseconds
63+
}
64+
65+
fun parseStringToInstant(): Instant {
66+
val instant = Instant.parse("2024-07-31T22:19:44.475Z")
67+
return instant
68+
}
69+
70+
fun parseStringToLocalDateTime(): LocalDateTime {
71+
val localDateTime = LocalDateTime.parse("2024-07-31T22:19")
72+
return localDateTime
73+
}
74+
75+
fun parseStringToLocalDate(): LocalDate {
76+
val localDate = LocalDate.parse("2024-07-31")
77+
return localDate
78+
}
79+
80+
fun parseStringToLocalTime(): LocalTime {
81+
val localTime = LocalTime.parse("10:19:22.111")
82+
return localTime
83+
}
84+
85+
fun getDateTimeFormat(): DateTimeFormat<LocalDate> {
86+
val dateFormat = LocalDate.Format {
87+
dayOfMonth()
88+
char('/')
89+
monthNumber()
90+
char('/')
91+
year()
92+
}
93+
val localDate = LocalDate.parse(input = "31/07/2024", format = dateFormat)
94+
logger.info(localDate.format(dateFormat))
95+
return dateFormat
96+
}
97+
98+
fun addAndSubtract() {
99+
val instant = Clock.System.now()
100+
val tenDaysFromNow: Instant = instant.plus(10, DateTimeUnit.DAY, TimeZone.UTC)
101+
val tenDaysBeforeNow: Instant = instant.minus(10, DateTimeUnit.DAY, TimeZone.UTC)
102+
val localDate = LocalDate(year = 2024, month = Month.JULY, dayOfMonth = 31)
103+
val oneYearFromLocalDate = localDate.plus(1, DateTimeUnit.YEAR)
104+
val oneYearBeforeLocalDate = localDate.minus(1, DateTimeUnit.YEAR)
105+
}
106+
107+
fun addMinutesToLocalDateTime() {
108+
val localDateTime = LocalDateTime(year = 2024, month = Month.JULY, dayOfMonth = 31, hour = 11, minute = 10, second = 0, nanosecond = 0)
109+
val timeZone = TimeZone.of("Brazil/West")
110+
val instant = localDateTime.toInstant(timeZone)
111+
val fiveMinutesAfter = instant.plus(5, DateTimeUnit.MINUTE)
112+
val localDateTimeFiveMinutesAfter = fiveMinutesAfter.toLocalDateTime(timeZone)
113+
}
114+
115+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
package com.baeldung.kotlinxDateTime
2+
3+
import com.baeldung.dates.kotlinxDatetime.KotlinxDateTimeOperations
4+
import kotlinx.datetime.*
5+
import kotlinx.datetime.format.DateTimeComponents
6+
import kotlinx.datetime.format.MonthNames
7+
import kotlinx.datetime.format.char
8+
import org.junit.jupiter.api.BeforeEach
9+
import org.junit.jupiter.api.Test
10+
import org.junit.jupiter.api.assertDoesNotThrow
11+
import kotlin.test.assertEquals
12+
import kotlin.test.assertTrue
13+
14+
class KotlinxDateTimeOperationsUnitTest {
15+
16+
@Test
17+
fun `given an Instant convert it to LocalDateTime`() {
18+
java.util.TimeZone.setDefault(java.util.TimeZone.getTimeZone("UTC"));
19+
20+
val instant = Instant.fromEpochSeconds(1722427200)
21+
assertEquals("2024-07-31T12:00:00Z", instant.toString())
22+
val localDateTime = instant.toLocalDateTime(TimeZone.currentSystemDefault()) // System is in UTC
23+
assertEquals("2024-07-31T12:00", localDateTime.toString())
24+
}
25+
26+
@Test
27+
fun `compare two LocalDateTime from different from the same TimeZone`() {
28+
val kotlinxDateTimeOperations = KotlinxDateTimeOperations()
29+
val instant = Instant.fromEpochSeconds(1722427200)
30+
val localDateTimeBrazil = kotlinxDateTimeOperations.getLocalDateTimeBrazilTimeZoneFromInstant(instant = instant)
31+
assertEquals("2024-07-31T09:00", localDateTimeBrazil.toString())
32+
val localDateTimeUtcMinus3 = kotlinxDateTimeOperations.getLocalDateTimeUtcMinus3TimeZoneFromInstant(instant = instant)
33+
assertEquals("2024-07-31T09:00", localDateTimeUtcMinus3.toString())
34+
}
35+
36+
@Test
37+
fun `create a LocalDateTime from function`() {
38+
val kotlinxDateTimeOperations = KotlinxDateTimeOperations()
39+
val localDateTime = kotlinxDateTimeOperations.createLocalDateTime()
40+
assertTrue { localDateTime is LocalDateTime }
41+
}
42+
43+
@Test
44+
fun `given an Instant create a LocalDate`() {
45+
val kotlinxDateTimeOperations = KotlinxDateTimeOperations()
46+
val localDate = kotlinxDateTimeOperations.getLocalDate()
47+
assertTrue { localDate is LocalDate }
48+
val instant = kotlinxDateTimeOperations.getInstant()
49+
val localDateFromInstant = kotlinxDateTimeOperations.convertInstantToLocalDate(instant)
50+
assertTrue { localDateFromInstant is LocalDate }
51+
}
52+
53+
@Test
54+
fun `given an Instant create a LocalTime`() {
55+
val kotlinxDateTimeOperations = KotlinxDateTimeOperations()
56+
val localTime = kotlinxDateTimeOperations.getLocalTime()
57+
assertTrue { localTime is LocalTime }
58+
val instant = kotlinxDateTimeOperations.getInstant()
59+
val localTimeFromInstant = kotlinxDateTimeOperations.convertInstantToLocalTime(instant)
60+
assertTrue { localTimeFromInstant is LocalTime }
61+
}
62+
63+
@Test
64+
fun `get EpochMilliSeconds from function`() {
65+
val kotlinxDateTimeOperations = KotlinxDateTimeOperations()
66+
val epochMilliseconds = kotlinxDateTimeOperations.compareInstantAndEpochMilliseconds()
67+
assertEquals(1722475458286, epochMilliseconds)
68+
}
69+
70+
@Test
71+
fun `parse String using different functions`() {
72+
val kotlinxDateTimeOperations = KotlinxDateTimeOperations()
73+
val instant = kotlinxDateTimeOperations.parseStringToInstant()
74+
assertTrue { instant is Instant }
75+
val localDateTime = kotlinxDateTimeOperations.parseStringToLocalDateTime()
76+
assertTrue { localDateTime is LocalDateTime }
77+
val localDate = kotlinxDateTimeOperations.parseStringToLocalDate()
78+
assertTrue { localDate is LocalDate }
79+
val localTime = kotlinxDateTimeOperations.parseStringToLocalTime()
80+
assertTrue { localTime is LocalTime }
81+
val dateTimeFormat = kotlinxDateTimeOperations.getDateTimeFormat()
82+
assertEquals("31/07/2024", dateTimeFormat.format(localDate))
83+
}
84+
85+
@Test
86+
fun `get DateTimeComponents from function`() {
87+
val monthDay = DateTimeComponents.Format {
88+
dayOfMonth()
89+
char('-')
90+
monthName(MonthNames.ENGLISH_FULL)
91+
}.parse("31-July")
92+
assertEquals("7", monthDay.monthNumber.toString())
93+
assertEquals("JULY", monthDay.month.toString())
94+
assertEquals("31", monthDay.dayOfMonth.toString())
95+
}
96+
97+
@Test
98+
fun `compare Duration from two Instants`() {
99+
val instant = Instant.parse("2024-07-31T22:00:00.000Z")
100+
val olderInstant = Instant.parse("2024-03-15T22:00:00.000Z")
101+
val duration = instant - olderInstant
102+
assertEquals(138, duration.inWholeDays)
103+
assertEquals(11923200000000000, duration.inWholeNanoseconds)
104+
}
105+
106+
@Test
107+
fun `get DateTimePeriod from two Instants`() {
108+
val instant = Instant.parse("2024-07-31T22:00:00.000Z")
109+
val olderInstant = Instant.parse("2022-03-15T12:05:01.050Z")
110+
val dateTimePeriod = olderInstant.periodUntil(instant, TimeZone.UTC)
111+
assertEquals(2, dateTimePeriod.years)
112+
assertEquals(4, dateTimePeriod.months)
113+
assertEquals(16, dateTimePeriod.days)
114+
assertEquals(9, dateTimePeriod.hours)
115+
assertEquals(54, dateTimePeriod.minutes)
116+
assertEquals(58, dateTimePeriod.seconds)
117+
assertEquals(950000000, dateTimePeriod.nanoseconds)
118+
}
119+
120+
@Test
121+
fun `get months between function result`() {
122+
val instant = Instant.parse("2024-07-31T22:00:00.000Z")
123+
val olderInstant = Instant.parse("2024-03-15T22:00:00.000Z")
124+
val monthsUntil = olderInstant.monthsUntil(instant, TimeZone.UTC)
125+
val months = olderInstant.until(instant, DateTimeUnit.MONTH, TimeZone.UTC)
126+
assertEquals(4, monthsUntil.toLong())
127+
assertEquals(4, months)
128+
}
129+
130+
@Test
131+
fun `run arithmetic operations funcitons`() {
132+
val kotlinxDateTimeOperations = KotlinxDateTimeOperations()
133+
assertDoesNotThrow {
134+
kotlinxDateTimeOperations.addAndSubtract()
135+
kotlinxDateTimeOperations.addMinutesToLocalDateTime()
136+
}
137+
}
138+
139+
}

0 commit comments

Comments
 (0)