@@ -3,18 +3,27 @@ package org.jetbrains.kotlinx.dataframe.io
3
3
import io.kotest.assertions.throwables.shouldThrow
4
4
import io.kotest.matchers.shouldBe
5
5
import kotlinx.datetime.LocalDateTime
6
+ import kotlinx.datetime.TimeZone
7
+ import kotlinx.datetime.toKotlinLocalDate
8
+ import kotlinx.datetime.toKotlinLocalDateTime
6
9
import org.jetbrains.kotlinx.dataframe.DataColumn
7
10
import org.jetbrains.kotlinx.dataframe.DataFrame
8
11
import org.jetbrains.kotlinx.dataframe.api.cast
9
12
import org.jetbrains.kotlinx.dataframe.api.columnOf
10
13
import org.jetbrains.kotlinx.dataframe.api.convertTo
11
14
import org.jetbrains.kotlinx.dataframe.api.convertToDouble
15
+ import org.jetbrains.kotlinx.dataframe.api.convertToLocalDate
16
+ import org.jetbrains.kotlinx.dataframe.api.convertToLocalDateTime
17
+ import org.jetbrains.kotlinx.dataframe.api.convertToLocalTime
12
18
import org.jetbrains.kotlinx.dataframe.api.parse
13
19
import org.jetbrains.kotlinx.dataframe.api.parser
20
+ import org.jetbrains.kotlinx.dataframe.api.plus
21
+ import org.jetbrains.kotlinx.dataframe.api.times
14
22
import org.jetbrains.kotlinx.dataframe.api.tryParse
15
23
import org.jetbrains.kotlinx.dataframe.exceptions.TypeConversionException
16
24
import org.junit.Test
17
25
import java.math.BigDecimal
26
+ import java.time.LocalTime
18
27
import java.util.Locale
19
28
import kotlin.reflect.typeOf
20
29
@@ -75,6 +84,50 @@ class ParserTests {
75
84
)
76
85
}
77
86
87
+ @Test
88
+ fun `convert to date and time` () {
89
+ val daysToStandardMillis = 24 * 60 * 60 * 1000L
90
+ val longCol = columnOf(1L , 60L , 3600L ).times(1000L ).plus(daysToStandardMillis * 366 )
91
+ val datetimeCol = longCol.convertToLocalDateTime(TimeZone .UTC )
92
+
93
+ datetimeCol.shouldBe(
94
+ columnOf(
95
+ java.time.LocalDateTime .of(1971 , 1 , 2 , 0 , 0 , 1 ).toKotlinLocalDateTime(),
96
+ java.time.LocalDateTime .of(1971 , 1 , 2 , 0 , 1 , 0 ).toKotlinLocalDateTime(),
97
+ java.time.LocalDateTime .of(1971 , 1 , 2 , 1 , 0 , 0 ).toKotlinLocalDateTime()
98
+ )
99
+ )
100
+ longCol.convertToLocalDate(TimeZone .UTC ).shouldBe(
101
+ columnOf(
102
+ java.time.LocalDate .of(1971 , 1 , 2 ).toKotlinLocalDate(),
103
+ java.time.LocalDate .of(1971 , 1 , 2 ).toKotlinLocalDate(),
104
+ java.time.LocalDate .of(1971 , 1 , 2 ).toKotlinLocalDate()
105
+ )
106
+ )
107
+ longCol.convertToLocalTime(TimeZone .UTC ).shouldBe(
108
+ columnOf(
109
+ LocalTime .of(0 , 0 , 1 ),
110
+ LocalTime .of(0 , 1 , 0 ),
111
+ LocalTime .of(1 , 0 , 0 )
112
+ )
113
+ )
114
+
115
+ datetimeCol.convertToLocalDate().shouldBe(
116
+ columnOf(
117
+ java.time.LocalDate .of(1971 , 1 , 2 ).toKotlinLocalDate(),
118
+ java.time.LocalDate .of(1971 , 1 , 2 ).toKotlinLocalDate(),
119
+ java.time.LocalDate .of(1971 , 1 , 2 ).toKotlinLocalDate()
120
+ )
121
+ )
122
+ datetimeCol.convertToLocalTime().shouldBe(
123
+ columnOf(
124
+ LocalTime .of(0 , 0 , 1 ),
125
+ LocalTime .of(0 , 1 , 0 ),
126
+ LocalTime .of(1 , 0 , 0 )
127
+ )
128
+ )
129
+ }
130
+
78
131
@Test
79
132
fun `converting String to Double in different locales` () {
80
133
val currentLocale = Locale .getDefault()
0 commit comments