Как преобразовать строку даты и времени в длинную (время эпохи UNIX) в Java 8 (Scala) - PullRequest
0 голосов
/ 24 января 2019

Я хочу, чтобы UNIX Epoch Time (Posix Time, Unix Time) строки в некотором pattern, строка была в обычном формате (поэтому UTC). Пожалуйста, используйте Java 8, а не Joda или старую Java.

(за миллисекунды см. Как преобразовать строку даты и времени в длинную (время эпохи UNIX) в миллисекундах в Java 8 (Scala) )

Пока у меня есть ниже, но я ненавижу это по ряду причин:

  1. Это слишком многословно для того, что чаще всего делают с датами (конвертировать в UNIX Epoch Time). 7 вызовов методов для того, что должно быть 1.
  2. Он должен указывать UTC, но, конечно, UTC - это просто значение по умолчанию, почему я должен быть здесь явно указан?
  3. имеет строковый литерал "UTC"
  4. У него есть магическое число ZoneOffset.ofHours(0)

Мое лучшее на данный момент:

def dateTimeStringToEpoch(s: String, pattern: String): Long = 
    LocalDateTime.parse(s, DateTimeFormatter.ofPattern(pattern))
      .atZone(ZoneId.ofOffset("UTC", ZoneOffset.ofHours(0)))
      .toInstant().getEpochSeconds

Кроме того, бонусный вопрос, это эффективно? Есть ли какие-либо накладные расходы на создание DateTimeFormatter через DateTimeFormatter.ofPattern(pattern)? Если так, почему?

Ответы [ 3 ]

0 голосов
/ 24 января 2019

Это более чем в два раза короче ( только 3 вызова метода ):

def dateTimeStringToEpoch(s: String, pattern: String): Long = 
     LocalDateTime.parse(s, DateTimeFormatter.ofPattern(pattern))
                  .toEpochSecond(ZoneOffset.UTC)

Кстати, я бы построил DateTimeFormatter за пределами dateTimeStringToEpoch и передал бы егов качестве параметра метода:

def dateTimeStringToEpoch(s: String, formatter: DateTimeFormatter): Long = 
     LocalDateTime.parse(s, formatter).toEpochSecond(ZoneOffset.UTC)

Фактически выполнив тест производительности, существует небольшая разница в производительности (едва ли в 2 раза) при инициализации DateTimeFormatter вне метода.

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
0 голосов
/ 24 января 2019

Вы можете использовать эквивалент следующего кода Java:

static long dateTimeStringToEpoch(String s, String pattern) {
    return DateTimeFormatter.ofPattern(pattern).withZone(ZoneOffset.UTC)
        .parse(s, p -> p.getLong(ChronoField.INSTANT_SECONDS));
}

Конечно, обработка DateTimeFormatter.ofPattern(pattern).withZone(ZoneOffset.UTC) подразумевает работу, которую можно было бы избежать при многократном обнаружении одной и той же строки шаблона.Соответствует ли этот объем работы вашему приложению, зависит от того, что выполняется рядом с этой операцией.

0 голосов
/ 24 января 2019

Можете ли вы попробовать это, основываясь на том, что вы сказали, это разбор UTC времени, поэтому у меня это в качестве образца.

Instant.parse("2019-01-24T12:48:14.530Z").getEpochSecond

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...