从 Java 中的日历日期设置 XMLGregorianCalendar 值

Set XMLGregorianCalendar value from a Calendar date in Java

从日历日期设置 XMLGregorianCalendar 值的最佳方法是什么?

    posting.setXMLGregorianCalendar(message.getCreateDate());

这是我的 class:

Message.java

private Calendar createDate;
public Calendar getCreateDate() {
    return createDate;
}

你可以试试这个:

Calendar createDate = Calendar.getInstance();
Date cDate = createDate.getTime();
GregorianCalendar c = new GregorianCalendar();
c.setTime(cDate);
XMLGregorianCalendar date2 = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);

tl;博士

DatatypeFactory.newInstance().newXMLGregorianCalendar( 
    GregorianCalendar.from( 
        ZonedDateTime.now( 
            ZoneId.of( "Pacific/Auckland" ) 
        ) 
    )
)

一个时刻需要一个时区

XMLGregorianCalendar, GregorianCalendar, and Calendarclass这些都代表一个时刻,即日期、时间和分配的时区。请注意时区问题。如果您未能显式指定时区,则将隐式分配 JVM 当前的默认时区。

Continent/Region的格式指定proper time zone name,例如America/EdmontonAfrica/TunisEurope/Moscow。切勿使用 2-4 个字母的缩写,例如 ESTIST,因为它们 不是 真正的时区,不是标准化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "America/Montreal" ) ;  

如果你想使用 JVM 当前的默认时区,请求它并作为参数传递。如果省略,代码将变得难以阅读,因为我们不确定您是否打算使用默认值,或者您是否像许多程序员一样没有意识到这个问题。

ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.

java.time

这些…Calendarclass也很糟糕。多年前,Sun、Oracle 和 JCP 社区在采用 JSR 310 时放弃了它们……您也应该这样做。仅将 java.time class 用于您的业务逻辑。

ZoneId z = ZoneId.of( "Africa/Casablanca" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ;   // Capture the current moment as seen through the wall-clock time used by the people of a particular region (a time zone).

转换

如果与尚未更新到 java.time 的旧代码进行交互,请在传统 classes 和现代 classes 之间转换。查看添加到旧 classes 的新方法。

可以通过调用 GregorianCalendar.from( ZonedDateTime ).[=40= 将 ZonedDateTime 对象转换为 GregorianCalendar 对象(Calendar 的子class) ]

GregorianCalendar gregCal = GregorianCalendar.from( zdt ) ;

一个GregorianCalendar可以转换成一个XMLGregorianCalendar,但是我们必须多走一步。 XMLGregorianCalendar class 本身缺少来自 GregorianCalendar 的转换器方法。帮手 class 可以完成工作,DatatypeFactory, as shown in by Stephen Colebourne, “JodaStephen”java.time 的发明者。

XMLGregorianCalendar xmlGregCal = DatatypeFactory.newInstance().newXMLGregorianCalendar( gregCal );

不是我推荐它,但您可以将它组合成一个单行,如顶部 tl;dr 部分所示。