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

时间:2018-09-27 07:26:03

标签: java time timezone unix-timestamp converters

我有一个字符串,例如:

1517439600000+0100

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

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

2)是否更容易转换为常规时间戳,例如YYYY-mm-dd hh:mm:ss 应该没问题的。

2 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

    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();

答案 1 :(得分:0)

    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