猿问

Java - 将带有时区的 Unix 时间(以毫秒为单位)转换为时间戳

我有一个字符串,例如:

1517439600000+0100

我想以毫秒为单位将其转换为 unix 时间,没有时区。我该怎么做?

ps 1)我不能使用substring(0,5)并向字符串添加 3.6m 毫秒,因为我有很多时区,一次是 +0100,然后是 +0200 等等......

2)如果更容易转换为像 YYYY-mm-dd hh:mm:ss 这样的常规时间戳应该没问题。


饮歌长啸
浏览 206回答 2
2回答

慕田峪9158850

您可以执行以下操作:    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();

呼如林

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)感到满意,您当然可以删除代码的后半部分。我的风格是在我不需要所有信息时也从字符串中收集所有信息。我用于拆分的正则表达式(?=[+-]), 是一个正向预测:它匹配 a+或之前的空字符串-。匹配空字符串很重要,因此字符串的任何部分都不会在拆分中丢失(我们需要保留符号)。解析偏移量的一种更简单的方法是ZoneOffset.of(parts[1])(正如 NiVeR 在另一个答案中所做的那样)。唯一的区别是DateTimeFormatter我使用的还验证格式确实是像+0100(无冒号)或Z.
随时随地看视频慕课网APP

相关分类

Java
我要回答