有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

datetime转换java。util。自定义时区为UTC的日期

我有一个java.util.Date对象。当我使用以下命令将其格式化为String时:

String timeString = new SimpleDateFormat("yyyy-MM-dd-HH:mm:ss-Z").format(time);

我得到:

2020-03-26-14:40:55-+0200

所以,我有正确的时区(但我可以有任何时区,不仅仅是^{),这很好

我想将此日期转换为UTC,然后将其转换为String。如果我向客户端发送带有日期的对象,那么Jackson将自动将其转换为UTC。但我想手动执行此操作

我该怎么做


共 (2) 个答案

  1. # 1 楼答案

    爪哇。时间

    我知道您有一个类型为java.util.Date的字段,您现在无法更改。对于该Date上的任何操作,您仍然应该首先将其转换为现代Instant,然后从那里开始进一步的工作。要将其转换为UTC格式的字符串,可以使用非常简单的:

        String timeString = yourJavaUtilDate.toInstant().toString();
        System.out.println(timeString);
    

    输出示例:

    2020-03-26T12:40:55Z

    虽然Instant是一个没有时区或偏移的时间点,就像Date一样,Instant.toString()以UTC格式生成ISO 8601格式的字符串,我觉得这很好。如果您想要问题中提到的特殊格式(您必须有非常特殊的原因):

        DateTimeFormatter formatter
                = DateTimeFormatter.ofPattern("yyyy-MM-dd-HH:mm:ss-Z");
        String timeString = yourJavaUtilDate.toInstant()
                .atOffset(ZoneOffset.UTC)
                .format(formatter);
    

    2020-03-26-12:40:55-+0000

    来自SimpleDateFormat的格式模式字符串也适用于现代DateTimeFormatter。情况并非总是如此,两种格式的字母之间存在差异,只有许多字母具有相同或相似的含义

    我自己使用的是一个非常古老的代码库,多年来它已经获得了过时和现代日期和时间类的混乱混合。因此,我们不断地在DateLocalDateOffsetDateTimeXMLGregorianCalendar和许多其他课程之间来回转换,这远不是理想的,而且还需要几年的时间才能达到只使用现代课程的最佳状态

    链接

  2. # 2 楼答案

    不再建议使用java.util进行日期-时间操作,尤其是时区或偏移量转换

    相反,使用java.time

    public static void main(String[] args) {
        // the String (with a strange formatting) to be parsed
        String datetime = "2020-03-26-14:40:55-+0200";
        // parse it to an OffsetDateTime
        OffsetDateTime odt = OffsetDateTime.parse(datetime,
                                        // using a formatter for this specific pattern
                                        DateTimeFormatter.ofPattern("yyyy-MM-dd-HH:mm:ss-x"));
        // print the parsing result
        System.out.println(odt);
        // then convert it to UTC (keeping the moment & adjusting the offset)
        OffsetDateTime odtUtc = odt.withOffsetSameInstant(ZoneOffset.UTC);
        // print the conversion result
        System.out.println(odtUtc);
    }
    

    提供以下输出

    2020-03-26T14:40:55+02:00
    2020-03-26T12:40:55Z