Quiero que el tiempo Unix Epoch (Tiempo de POSIX, Unix Time) de una cadena en algunos pattern
, la cadena está en formato normal (por lo GMT). Por favor, usando Java 8, no Joda o viejo Java.
(Por favor, consulte los milisegundos Cómo convertir una cadena de fecha y hora a la larga (Unix Epoch Time) milisegundos en Java 8 (Scala) )
Hasta ahora tengo el siguiente, pero no me gusta esto por un número de razones:
- Es demasiado detallado de lo que es la cosa más común que ver con las fechas (convertir a Unix Epoch Time). 7 método llama para lo que debería ser 1.
- Se tiene que especificar UTC, pero seguramente UTC es sólo un defecto, ¿por qué tengo que ser explícita aquí?
- Tiene un literal de cadena
"UTC"
- Tiene un número mágico
ZoneOffset.ofHours(0)
Mi mejor hasta el momento:
def dateTimeStringToEpoch(s: String, pattern: String): Long =
LocalDateTime.parse(s, DateTimeFormatter.ofPattern(pattern))
.atZone(ZoneId.ofOffset("UTC", ZoneOffset.ofHours(0)))
.toInstant().getEpochSeconds
Además, pregunta extra, ¿es eficiente? ¿Hay alguna sobrecarga para la creación de la DateTimeFormatter
vía DateTimeFormatter.ofPattern(pattern)
? Si es así ¿por qué?
Este es más de dos veces más cortas ( sólo 3 llamadas de método ):
def dateTimeStringToEpoch(s: String, pattern: String): Long =
LocalDateTime.parse(s, DateTimeFormatter.ofPattern(pattern))
.toEpochSecond(ZoneOffset.UTC)
Por cierto, me gustaría construir el DateTimeFormatter
exterior dateTimeStringToEpoch
y pasarlo como un parámetro de método:
def dateTimeStringToEpoch(s: String, formatter: DateTimeFormatter): Long =
LocalDateTime.parse(s, formatter).toEpochSecond(ZoneOffset.UTC)
Después de haber hecho ejecutar una prueba de rendimiento, hay poca diferencia en el rendimiento (apenas un factor de 2) en la inicialización de la DateTimeFormatter
fuera del método.
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