I would like to have a generic and fast parser for dates that comes with random format like:
- 2018
- 2018-12-31
- 2018/12/31
- 2018 dec 31
- 20181231151617
- 2018-12-31T15:16:17
- 2018-12-31T15:16:17.123456
- 2018-12-31T15:16:17.123456Z
- 2018-12-31T15:16:17.123456 UTC
- 2018-12-31T15:16:17.123456+01:00
- ... so many possibilities
Is there a nice way a or "magic" function do that?
Currently I am planning to use something like this:
val formatter = new DateTimeFormatterBuilder()
.appendPattern("[yyyy-MM-dd'T'HH:mm:ss]")
.appendPattern("[yyyy-MM-dd]")
.appendPattern("[yyyy]")
// add so many things here
.parseDefaulting(ChronoField.MONTH_OF_YEAR, 1)
.parseDefaulting(ChronoField.DAY_OF_MONTH, 1)
.parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
.parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
.parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
.parseDefaulting(ChronoField.MICRO_OF_SECOND, 0)
.toFormatter()
val temporalAccessor = formatter.parse("2018")
val localDateTime = LocalDateTime.from(temporalAccessor)
localDateTime.getHour
val zonedDateTime = ZonedDateTime.of(localDateTime, ZoneId.systemDefault)
val result = Instant.from(zonedDateTime)
But is there a smarter way than specifying hundreds of formats?
Most of answers I found are outdated (pre Java8) or do not focus on performance and a lot of different formats.