将毫秒转换为带有偏移小时数的java日期(z05:00)

pbgvytdp  于 2021-06-15  发布在  Cassandra
关注(0)|答案(1)|浏览(438)

如何将以毫秒为单位的字符串值转换为日期格式的字符串 "2006-01-02T15:04:05Z07:00" ? (包括z偏移)

eimct9ow

eimct9ow1#

编辑:您的字符串是占位符字符串

我相信 "2006-01-02T15:04:05Z07:00" 是golang指定日期时间格式的方法。更准确地说是iso8601格式。实际格式化的字符串如下所示 2018-09-19T00:26:42-05:00 . 所以使用 DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssXXX") 或者只是 DatetimeFormatter.ISO_OFFSET_DATE_TIME (格式化程序格式化字符串后不进行替换)。

原始答案

这分为两个步骤:
将毫秒字符串(我假设从1970-01-01的纪元起)转换为 Instant .
转换 Instant 到所需的时区并格式化它。
挑战在于第二步。偏移有正负号,偏移的标准格式选项包括 - 或者 + (除了偏移量0有时写为 Z 没有标志)。我想说的是:

ZoneId zone = ZoneId.of("America/Denver");
    DateTimeFormatter firstShotFormatter
            = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss'Z'xxx");

    String milliseconds = "1136239445000";

    Instant pointInTime = Instant.ofEpochMilli(Long.parseLong(milliseconds));
    String firstShot = pointInTime.atZone(zone).format(firstShotFormatter);
    // Offset should be negative
    if (firstShot.contains("Z-")) {
        // Remove minus sign from formatted offset
        String result = firstShot.replace("Z-", "Z");
        System.out.println("Formatted string: " + result);
    } else {
        throw new IllegalStateException(
                "Don’t know how to format a positive offset from UTC");
    }

此代码段的输出是:
格式化字符串:2006-01-02t15:04:05z07:00
我初步猜测你方 Z07:00 指北美山地时间,偏移量为1月7:00。请检查一下。我不知道如何处理正偏移量,所以我的代码检查它是否发生。
我觉得你要求的格式很奇怪。它的特性符合iso8601标准 T 在日期和时间之间。但据我所知,ISO8601会有偏移量 Z (表示零)或有符号,例如 -07:00 从来没有混合过。您可能需要检查是否可以说服格式化字符串的接收者接受直接的ISO8601字符串。我会发现这更干净,最终更容易理解各方。

链接

维基百科上的iso 8601
在golang中格式化日期和时间

相关问题