datetime - ZonedDateTime 中的 XMLGregorianCalendar 格式日期

标签 datetime java-8 timezone zoneddatetime

我有一个函数,它接受日期并提供 XMLGregorianCalendar 格式的日期,如下所示,当日期提供为 2017- 时,该函数返回日期为 2017-11-30T00:00:00.000-08:00 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);
}

最佳答案

假设日期是此时此刻,那么您得到 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)

关于datetime - ZonedDateTime 中的 XMLGregorianCalendar 格式日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47567449/

相关文章:

c# - 同步两个日期时间

java - 通过匹配其他两个列表中的条目来创建新的 Java 对象列表

java - 使用 Java 8 Streams 如何使用一个列表获取两个不同的列表

python - 如何将时间戳从 PostgreSQL 数据库转换为用户时区时间?

php - 计算 PHP 中不包括周末和时间段的时间差(以秒为单位)

php - 从列中选择时间具有带 sql 的日期时间格式

mysql - 如何使用脚本将此日期格式转换为 mysql

java - 在 List<List<Entry<String, Double>>> 中使用 Java 8 过滤对象排列

javascript - 设置 "Etc/GMT[+|-]HH:MM"时区的 moment.tz 问题

mysql - 服务器时区值 'CEST' 无法识别