Skip to content

Commit d0dbecb

Browse files
authored
Core: Support parse Date64 which contains nano seconds (#258)
* Core: Support parse Date64 which contains nano seconds * nit
1 parent 705f311 commit d0dbecb

File tree

2 files changed

+22
-3
lines changed

2 files changed

+22
-3
lines changed

clickhouse-core/src/main/scala/xenon/clickhouse/Utils.scala

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@ import java.math.{MathContext, RoundingMode}
2121
import java.net.URI
2222
import java.nio.file.{Files, Path, StandardCopyOption}
2323
import java.time.Duration
24-
import java.time.format.DateTimeFormatter
24+
import java.time.chrono.IsoChronology
25+
import java.time.format.{DateTimeFormatter, DateTimeFormatterBuilder, ResolverStyle}
26+
import java.time.temporal.ChronoField
2527
import java.util.Locale
2628
import java.util.concurrent.TimeUnit.NANOSECONDS
2729
import java.util.concurrent.locks.LockSupport
@@ -33,7 +35,18 @@ import scala.util.{Failure, Success, Try}
3335
object Utils extends Logging {
3436

3537
@transient lazy val dateFmt: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd")
36-
@transient lazy val dateTimeFmt: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
38+
@transient lazy val dateTimeFmt: DateTimeFormatter = new DateTimeFormatterBuilder()
39+
.parseCaseInsensitive()
40+
.append(DateTimeFormatter.ISO_LOCAL_DATE)
41+
.appendLiteral(' ')
42+
.appendValue(ChronoField.HOUR_OF_DAY, 2).appendLiteral(':')
43+
.appendValue(ChronoField.MINUTE_OF_HOUR, 2).appendLiteral(':')
44+
.appendValue(ChronoField.SECOND_OF_MINUTE, 2)
45+
.appendFraction(ChronoField.NANO_OF_SECOND, 0, 9, true)
46+
.toFormatter(Locale.US)
47+
.withChronology(IsoChronology.INSTANCE)
48+
.withResolverStyle(ResolverStyle.STRICT)
49+
3750
@transient lazy val legacyDateFmt: FastDateFormat = FastDateFormat.getInstance("yyyy-MM-dd")
3851
@transient lazy val legacyDateTimeFmt: FastDateFormat = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss")
3952

clickhouse-core/src/test/scala/xenon/clickhouse/UtilsSuite.scala

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ package xenon.clickhouse
1717
import org.scalatest.funsuite.AnyFunSuite
1818
import xenon.clickhouse.Utils._
1919

20-
import java.time.Duration
20+
import java.time.{Duration, LocalDateTime}
2121

2222
class UtilsSuite extends AnyFunSuite {
2323

@@ -61,4 +61,10 @@ class UtilsSuite extends AnyFunSuite {
6161
}
6262
assert(counter == 1)
6363
}
64+
65+
test("parse date with nano seconds") {
66+
val actual = LocalDateTime.parse("2023-03-29 15:25:25.977", Utils.dateTimeFmt)
67+
val expected = LocalDateTime.of(2023, 3, 29, 15, 25, 25, 977000000)
68+
assert(actual === expected)
69+
}
6470
}

0 commit comments

Comments
 (0)