Форматирование DateTime с последними нулями и привязкой к милли, микро или нано формату - PullRequest
0 голосов
/ 28 октября 2019

У меня есть некоторый код, подобный этому

import java.time.Instant


val tstamp = 1546344620.1877
val nanoAdj = ((BigDecimal(tstamp) - tstamp.toLong) * 1000000000).toLong
Instant.ofEpochSecond(tstamp.toLong, nanoAdj).toString
// will print : 2019-01-01T12:10:20.187700Z

toString из объекта Instant, созданного из ofEpochSecond, отлично подходит с конечными нулями для группы милли / микро / нано, но я изо всех сил стараюсьполучить отформатированный, чтобы сделать то же самое. Мне нужно немного изменить формат на что-то вроде 2019-01-01 12:10:20.187700 UTC

Другие примеры:

2019-01-01 12:10:20 UTC // no fractions
2019-01-01 12:10:20.180 UTC // milliseconds
2019-01-01 12:10:20.187700 UTC // microseconds
2019-01-01 12:10:20.187738200 UTC // nanoseconds

Я использую DateTimeFormatter, как показано ниже, но я открыт для других предложений.

def formatter: DateTimeFormatter = {
      val tz_format = new DateTimeFormatterBuilder()
        .optionalStart
        .parseCaseSensitive()
        .appendZoneRegionId()
        .toFormatter

      val datetime_format = new DateTimeFormatterBuilder()
        .appendValue(HOUR_OF_DAY, 2)
        .appendLiteral(':')
        .appendValue(MINUTE_OF_HOUR, 2)
        .optionalStart()
        .appendLiteral(':')
        .appendValue(SECOND_OF_MINUTE, 2)
        .optionalStart()
        .appendFraction(NANO_OF_SECOND, 0, 9, true)
        .toFormatter

      new DateTimeFormatterBuilder()
        .parseCaseInsensitive
        .append(ISO_LOCAL_DATE)
        .appendLiteral(' ')
        .append(datetime_format)
        .appendLiteral(' ')
        .append(tz_format)
        .toFormatter
        .withZone(ZoneId.of("UTC"))
    }

1 Ответ

0 голосов
/ 28 октября 2019

Как сказал Андреас в комментарии, класс для форматирования DateTimeFormatter не поддерживает эту изящную функциональность. Мое лучшее предложение - использовать LocalTime.toString(), в котором оно есть. Извините за код Java.

private static final DateTimeFormatter dateFormatter
        = DateTimeFormatter.ofPattern("uuuu-MM-dd ");

private static String formatEpochSeconds(String epochSeconds) {
    BigDecimal totalSeconds = new BigDecimal(epochSeconds);
    long seconds = totalSeconds.longValue();
    long nanos = totalSeconds.subtract(new BigDecimal(seconds))
            .multiply(new BigDecimal(TimeUnit.SECONDS.toNanos(1)))
            .longValue();
    OffsetDateTime dateTime = Instant.ofEpochSecond(seconds, nanos)
            .atOffset(ZoneOffset.UTC);
    return dateTime.format(dateFormatter)
            + dateTime.toLocalTime()
            + " UTC";
}

Пробуем:

    System.out.println(formatEpochSeconds("1546344600.0"));
    System.out.println(formatEpochSeconds("1546344620.0"));
    System.out.println(formatEpochSeconds("1546344620.18"));
    System.out.println(formatEpochSeconds("1546344620.1877"));
    System.out.println(formatEpochSeconds("1546344620.1877382"));

Вывод:

2019-01-01 12:10 UTC
2019-01-01 12:10:20 UTC
2019-01-01 12:10:20.180 UTC
2019-01-01 12:10:20.187700 UTC
2019-01-01 12:10:20.187738200 UTC

Обратите внимание, что секундыопускаются полностью, если они 0,0. Если вы не хотите этого, вам нужно кодировать особый случай.

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