How to convert a date time string to long (UNIX Epoch Time) in Java 8 (Scala)
You may use the equivalent of the following Java code:
static long dateTimeStringToEpoch(String s, String pattern) {
return DateTimeFormatter.ofPattern(pattern).withZone(ZoneOffset.UTC)
.parse(s, p -> p.getLong(ChronoField.INSTANT_SECONDS));
}
Of course, processing DateTimeFormatter.ofPattern(pattern).withZone(ZoneOffset.UTC)
implies work that could be avoided when encountering the same pattern string multiple times. Whether this amount of work is relevant for your application, depends on what is is doing beside this operation.
Can you try this one, based on what you have said, it is parsing UTC time, so I have this as a sample.
Instant.parse("2019-01-24T12:48:14.530Z").getEpochSecond
This one is more than two times shorter (only 3 method calls):
def dateTimeStringToEpoch(s: String, pattern: String): Long =
LocalDateTime.parse(s, DateTimeFormatter.ofPattern(pattern))
.toEpochSecond(ZoneOffset.UTC)
Btw, I would build the DateTimeFormatter
outside of dateTimeStringToEpoch
and pass it as a method parameter:
def dateTimeStringToEpoch(s: String, formatter: DateTimeFormatter): Long =
LocalDateTime.parse(s, formatter).toEpochSecond(ZoneOffset.UTC)
Having actually run a performance test, there is little difference in performance (barely a factor of 2) in initialising the DateTimeFormatter
outside the method.
scala> val pattern = "yyyy/MM/dd HH:mm:ss"
pattern: String = yyyy/MM/dd HH:mm:ss
scala> time(() => randomDates.map(dateTimeStringToEpoch(_, pattern)))
Took: 1216
scala> time(() => randomDates.map(dateTimeStringToEpochFixed))
Took: 732