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
.