Java - конвертировать время Unix в миллисекундах с часовым поясом в метку времени - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть строка, например:

1517439600000+0100

, и я хочу преобразовать ее в Unix-время в миллисекундах без часового пояса.как я могу это сделать?

ps 1) Я не могу использовать substring(0,5) и добавить 3,6 миллисекунды к строке, потому что у меня много часовых поясов, когда-то +0100, а затем +0200 и т. д..

2) если проще конвертировать в обычную метку времени, например, ГГГГ-мм-дд чч: мм: сс, то все должно быть в порядке.

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018
    String exampleString = "1517439600000+0100";
    // Split string before + or-
    String[] parts = exampleString.split("(?=[+-])");
    if (parts.length != 2) {
        throw new IllegalArgumentException("Unexpected/unsupported format: " + exampleString);
    }
    // Parse the milliseconds into an Instant
    Instant timeStamp = Instant.ofEpochMilli(Long.parseLong(parts[0]));
    // Parse the offset into a ZoneOffset
    DateTimeFormatter offsetFormatter = DateTimeFormatter.ofPattern("xx");
    ZoneOffset offset = ZoneOffset.from(offsetFormatter.parse(parts[1]));
    // Combine
    OffsetDateTime dateTime = timeStamp.atOffset(offset);
    System.out.println(dateTime);

Вывод:

2018-02-01T00: 00 + 01: 00

Количество миллисекунд с начала эпохи (1 517 439 600 000) обозначает момент времени независимо от часового пояса или смещения.Поэтому для получения метки времени достаточно проанализировать этот номер.Если вы довольны Instant (2018-01-31T23: 00: 00Z в примере), вы, конечно, можете удалить последнюю половину кода.Мой стиль будет заключаться в том, чтобы собирать всю информацию из строки, даже если она мне сразу не нужна.

Регулярное выражение, которое я использую для разбиения, (?=[+-]) - это позитивный прогноз:это соответствует пустой строке перед + или -.Сопоставление с пустой строкой важно, поэтому ни одна часть строки не теряется при разбиении (нам нужно сохранить знак).

Более простой способ анализа смещения - ZoneOffset.of(parts[1]) (как это делает NiVeR в другом ответе).).Единственное отличие состоит в том, что DateTimeFormatter, который я использую, также подтверждает, что формат действительно похож на +0100 (без двоеточия) или Z.

0 голосов
/ 27 сентября 2018

Вы можете сделать что-то вроде:

    String sign = "+";
    String [] parts = time.split(sign);

    Long millis = Long.parseLong(parts[0]);
    String zoneOffset = sign + parts[1];

    LocalDate date = Instant.ofEpochMilli(millis).atZone(ZoneOffset.of(zoneOffset)).toLocalDate();
...