java—如何在xmlgregoriancalendar中使用区域设置时间戳

cfh9epnr  于 2021-07-06  发布在  Java
关注(0)|答案(2)|浏览(378)

我有这种格式的datetime '2020-11-08T13:05:46.000-07:00' 并试图将其设置为 XMLGregorianCalendar . 它会自动转换为 2020-11-08T20:05:46.000+0000 .
要保存为utc吗?

weylhg0b

weylhg0b1#

热释光;博士

OffsetDateTime
.parse( "2020-11-08T13:05:46.000-07:00" )
.toInstant()

java.time文件 XMLGregorianCalendar 是一个遗留类,多年前被 ZonedDateTime .

您的输入没有时区,只有与utc的偏移量。所以把这个字符串作为 OffsetDateTime .

OffsetDateTime odt = OffsetDateTime.parse( "2020-11-08T13:05:46.000-07:00" ) ;

调整为utc(零小时分秒的偏移量)的最简单方法是提取 Instant .

Instant instant = odt.toInstant() ;
eeq64g8w

eeq64g8w2#

您可以按以下步骤进行:

import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;

public class Main {
    public static void main(String[] args) throws DatatypeConfigurationException {
        String givenDateTimeString = "2020-11-08T13:05:46.000-07:00";
        XMLGregorianCalendar xmlGregorianCalendar = DatatypeFactory.newInstance()
                .newXMLGregorianCalendar(givenDateTimeString);
        System.out.println(xmlGregorianCalendar);
    }
}

输出:

2020-11-08T13:05:46.000-07:00

但是,我建议您切换到现代日期时间api。
使用现代日期时间api:

import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        String givenDateTimeString = "2020-11-08T13:05:46.000-07:00";
        OffsetDateTime odt = OffsetDateTime.parse(givenDateTimeString);
        // Default format i.e. OffsetDateTime#toString
        System.out.println(odt);

        // Custom format
        System.out.println(odt.format(DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSXXX", Locale.ENGLISH)));

        // Convert it to date-time at UTC
        OffsetDateTime odtUTC = odt.withOffsetSameInstant(ZoneOffset.UTC);
        System.out.println(odtUTC);
        System.out.println(odtUTC.format(DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSX", Locale.ENGLISH)));
    }
}

输出:

2020-11-08T13:05:46-07:00
2020-11-08T13:05:46.000-07:00
2020-11-08T20:05:46Z
2020-11-08T20:05:46.000Z

在trail:date-time了解有关现代日期时间api的更多信息。

相关问题