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

问题描述 投票:-3回答:1

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

java cassandra datetime-format timezone-offset milliseconds
1个回答
2
投票

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

我相信"2006-01-02T15:04:05Z07:00"是Golang指定日期时间格式的方式。 ISO 8601格式更精确。实际格式化的字符串就像例如2018-09-19T00:26:42-05:00。所以使用DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssXXX")或只是DatetimeFormatter.ISO_OFFSET_DATE_TIME(格式化器格式化字符串后没有替换)。

原始答案

这分为两步:

  1. 将你的毫秒字符串(我假设自1970-01-01的纪元以来)转换为Instant
  2. Instant转换为所需的时区并对其进行格式化。

挑战在于第二步。偏移有正号或负号的标志,偏移的标准格式选项包括-+(除了偏移零有时写为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月份偏离-07:00。请检查。我不知道如何处理正偏移,所以我的代码检查它不会发生。

我发现你要求的格式很奇特。它在日期和时间部分之间以其特有的T重新采用ISO 8601。但据我所知,ISO 8601可以将偏移量作为Z(零)或签名,例如-07:00,从不混合使用。您可能想要检查是否可以说服格式化字符串的接收器接受直接的ISO 8601字符串。我发现这个更清洁,最终更易于理解各方。

链接

© www.soinside.com 2019 - 2024. All rights reserved.