为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

饮歌长啸 2021-10-13 16:38:33
我有一个字符串,例如:1517439600000+0100我想以毫秒为单位将其转换为 unix 时间,没有时区。我该怎么做?ps 1)我不能使用substring(0,5)并向字符串添加 3.6m 毫秒,因为我有很多时区,一次是 +0100,然后是 +0200 等等......2)如果更容易转换为像 YYYY-mm-dd hh:mm:ss 这样的常规时间戳应该没问题。
查看完整描述

2 回答

?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

您可以执行以下操作:


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



查看完整回答
反对 回复 2021-10-13
?
呼如林

TA贡献1798条经验 获得超3个赞

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.


查看完整回答
反对 回复 2021-10-13
  • 2 回答
  • 0 关注
  • 205 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信