Skip to content

Commit 3a98a91

Browse files
authored
Fix datetime and timestamp (#118)
1 parent a4ba85e commit 3a98a91

File tree

2 files changed

+61
-4
lines changed

2 files changed

+61
-4
lines changed

kotlin/local-data-api/src/com/koxudaxi/localDataApi/LocalDataApi.kt

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ val TIME = listOf(Types.TIME)
1919
val TIME_TZ = listOf(Types.TIME_WITH_TIMEZONE)
2020

2121
fun stripNanoSecs(time: String): String {
22+
if ('.' !in time) return time
2223
val splitTime = time.split(".")
2324
return splitTime[0] + ".${splitTime[1]}".dropLastWhile { char -> char == '0' || char == '.' }
2425
}
@@ -44,6 +45,14 @@ fun convertOffsetTimeToUTC(input: String): String {
4445
}
4546

4647

48+
fun formatDatetime(input: String): String {
49+
return stripNanoSecs(Regex("^[^.]+\\.\\d{1,6}|^[^.]+").find(input)!!.value)
50+
}
51+
52+
fun formatTime(input: String): String {
53+
return stripNanoSecs(Regex("^[^.]+\\.\\d{1,3}|^[^.]+").find(input)!!.value)
54+
}
55+
4756
fun createField(resultSet: ResultSet, index: Int): Field {
4857
if (resultSet.getObject(index) == null) {
4958
return Field(isNull = true)
@@ -56,12 +65,10 @@ fun createField(resultSet: ResultSet, index: Int): Field {
5665
value in BLOB -> Field(blobValue = Base64.getEncoder().encodeToString(resultSet.getBytes(index)))
5766
value in DATETIME_TZ || (value in DATETIME && resultSet.metaData.getColumnTypeName(index) == "timestamptz")
5867
-> Field(stringValue = convertOffsetDatetimeToUTC(resultSet.getString(index)))
59-
value in DATETIME -> Field(stringValue = Regex("^[^.]+\\.\\d{1,6}|^[^.]+").find(resultSet.getString(
60-
index))!!.value)
68+
value in DATETIME -> Field(stringValue = formatDatetime(resultSet.getString(index)))
6169
value in TIME_TZ || (value in TIME && resultSet.metaData.getColumnTypeName(index) == "timetz")
6270
-> Field(stringValue = convertOffsetTimeToUTC(resultSet.getString(index)))
63-
value in TIME -> Field(stringValue = Regex("^[^.]+\\.\\d{1,3}|^[^.]+").find(resultSet.getString(
64-
index))!!.value)
71+
value in TIME -> Field(stringValue = formatTime(resultSet.getString(index)))
6572
else -> Field(stringValue = resultSet.getString(index))
6673
}
6774
}

kotlin/local-data-api/test/com/koxudaxi/localDataApi/LocalDataApiTest.kt

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ class LocalDataApiTest {
4141
assertEquals("2021-03-10 20:41:04.123", convertOffsetDatetimeToUTC("2021-03-10 22:41:04.123+02"))
4242
assertEquals("2021-03-10 20:41:04.12", convertOffsetDatetimeToUTC("2021-03-10 22:41:04.12+02"))
4343
assertEquals("2021-03-10 20:41:04.1", convertOffsetDatetimeToUTC("2021-03-10 22:41:04.1+02"))
44+
assertEquals("2021-03-10 20:41:04", convertOffsetDatetimeToUTC("2021-03-10 22:41:04.0+02"))
4445
assertEquals("2021-03-10 20:41:04", convertOffsetDatetimeToUTC("2021-03-10 22:41:04+02"))
4546
assertEquals("2021-03-10 20:41:04.00005", convertOffsetDatetimeToUTC("2021-03-10 22:41:04.000050+02"))
4647
assertEquals("2021-03-10 20:41:04.0004", convertOffsetDatetimeToUTC("2021-03-10 22:41:04.000400+02"))
@@ -64,6 +65,7 @@ class LocalDataApiTest {
6465
assertEquals("20:41:04.123", convertOffsetTimeToUTC("22:41:04.123+02"))
6566
assertEquals("20:41:04.12", convertOffsetTimeToUTC("22:41:04.12+02"))
6667
assertEquals("20:41:04.1", convertOffsetTimeToUTC("22:41:04.1+02"))
68+
assertEquals("20:41:04", convertOffsetTimeToUTC("22:41:04.0+02"))
6769
assertEquals("20:41:04", convertOffsetTimeToUTC("22:41:04+02"))
6870
assertEquals("20:41:04", convertOffsetTimeToUTC("22:41:04.000050+02"))
6971
assertEquals("20:41:04", convertOffsetTimeToUTC("22:41:04.000400+02"))
@@ -72,6 +74,54 @@ class LocalDataApiTest {
7274
assertEquals("20:41:04", convertOffsetTimeToUTC("22:41:04.000000+02"))
7375
}
7476

77+
@Test
78+
fun testFormatDatetime() {
79+
assertEquals("2021-03-10 20:41:04.123456", formatDatetime("2021-03-10 20:41:04.123456"))
80+
assertEquals("2021-03-10 20:41:04.123456", formatDatetime("2021-03-10 20:41:04.123456"))
81+
assertEquals("2021-03-10 20:41:04.12345", formatDatetime("2021-03-10 20:41:04.123450"))
82+
assertEquals("2021-03-10 20:41:04.1234", formatDatetime("2021-03-10 20:41:04.123400"))
83+
assertEquals("2021-03-10 20:41:04.123", formatDatetime("2021-03-10 20:41:04.123000"))
84+
assertEquals("2021-03-10 20:41:04.12", formatDatetime("2021-03-10 20:41:04.120000"))
85+
assertEquals("2021-03-10 20:41:04.1", formatDatetime("2021-03-10 20:41:04.100000"))
86+
assertEquals("2021-03-10 20:41:04", formatDatetime("2021-03-10 20:41:04.000000"))
87+
assertEquals("2021-03-10 20:41:04.12345", formatDatetime("2021-03-10 20:41:04.12345"))
88+
assertEquals("2021-03-10 20:41:04.1234", formatDatetime("2021-03-10 20:41:04.1234"))
89+
assertEquals("2021-03-10 20:41:04.123", formatDatetime("2021-03-10 20:41:04.123"))
90+
assertEquals("2021-03-10 20:41:04.12", formatDatetime("2021-03-10 20:41:04.12"))
91+
assertEquals("2021-03-10 20:41:04.1", formatDatetime("2021-03-10 20:41:04.1"))
92+
assertEquals("2021-03-10 20:41:04", formatDatetime("2021-03-10 20:41:04.0"))
93+
assertEquals("2021-03-10 20:41:04", formatDatetime("2021-03-10 20:41:04"))
94+
assertEquals("2021-03-10 20:41:04.00005", formatDatetime("2021-03-10 20:41:04.000050"))
95+
assertEquals("2021-03-10 20:41:04.0004", formatDatetime("2021-03-10 20:41:04.000400"))
96+
assertEquals("2021-03-10 20:41:04.003", formatDatetime("2021-03-10 20:41:04.003000"))
97+
assertEquals("2021-03-10 20:41:04.02", formatDatetime("2021-03-10 20:41:04.020000"))
98+
assertEquals("2021-03-10 20:41:04", formatDatetime("2021-03-10 20:41:04.000000"))
99+
}
100+
101+
@Test
102+
fun testFormatTime() {
103+
assertEquals("20:41:04.123", formatTime("20:41:04.123456"))
104+
assertEquals("20:41:04.123", formatTime("20:41:04.123456"))
105+
assertEquals("20:41:04.123", formatTime("20:41:04.123450"))
106+
assertEquals("20:41:04.123", formatTime("20:41:04.123400"))
107+
assertEquals("20:41:04.123", formatTime("20:41:04.123000"))
108+
assertEquals("20:41:04.12", formatTime("20:41:04.120000"))
109+
assertEquals("20:41:04.1", formatTime("20:41:04.100000"))
110+
assertEquals("20:41:04", formatTime("20:41:04.000000"))
111+
assertEquals("20:41:04.123", formatTime("20:41:04.12345"))
112+
assertEquals("20:41:04.123", formatTime("20:41:04.1234"))
113+
assertEquals("20:41:04.123", formatTime("20:41:04.123"))
114+
assertEquals("20:41:04.12", formatTime("20:41:04.12"))
115+
assertEquals("20:41:04.1", formatTime("20:41:04.1"))
116+
assertEquals("20:41:04", formatTime("20:41:04.0"))
117+
assertEquals("20:41:04", formatTime("20:41:04"))
118+
assertEquals("20:41:04", formatTime("20:41:04.000050"))
119+
assertEquals("20:41:04", formatTime("20:41:04.000400"))
120+
assertEquals("20:41:04.003", formatTime("20:41:04.003000"))
121+
assertEquals("20:41:04.02", formatTime("20:41:04.020000"))
122+
assertEquals("20:41:04", formatTime("20:41:04.000000"))
123+
}
124+
75125
@Test
76126
fun testCreateField() {
77127
// For PostgreSQL

0 commit comments

Comments
 (0)