2

我有一个函数,它接受 Date 并给出 XMLGregorianCalendar 格式的日期,如下所示,它返回日期作为2017-11-30T00:00:00.000-08:00日期提供为2017-11-30

public static String xmlDate(Date date) {
    XMLGregorianCalendar xmlDate = null;
    if (date != null) {
        GregorianCalendar gc = new GregorianCalendar();
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        gc.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));
        gc.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
        gc.set(Calendar.MILLISECOND, 0);

        try {
            xmlDate = DatatypeFactory.newInstance().newXMLGregorianCalendar(gc);
        } catch (DatatypeConfigurationException e) {
            //exception
        }
    }
    return xmlDate.toString();
}

我正在尝试使用 Java 8 ZonedDateTime 重写上述函数,但将日期设为 。2017-11-29T00:00:00-08:00如何获得与上述函数相同的确切输出?我也不明白为什么日期是 29 而不是 30。

public static String zonedDatetime(Date date) {
    return ZonedDateTime.ofInstant(date.toInstant(), ZoneId.of("America/Los_Angeles"))
            .truncatedTo(ChronoUnit.DAYS)
            .format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
}
4

1 回答 1

3

假设那date是这一刻,那么您获得 29 日的原因是因为那是此时洛杉矶的日期(太平洋标准时间 22:53)。

如果你想匹配本地日期,那么你可能会追求这样的事情:

return ZonedDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault())
            .withZoneSameLocal(ZoneId.of("America/Los_Angeles"))
            .truncatedTo(ChronoUnit.DAYS)
            .format(DateTimeFormatter.ISO_OFFSET_DATE_TIME)
于 2017-11-30T06:56:08.437 回答