从日历日期设置XMLGregorianCalendar值的最佳方法是什么?
posting.setXMLGregorianCalendar(message.getCreateDate());
这是我的课:
Message.java
private Calendar createDate;
public Calendar getCreateDate() {
return createDate;
}
答案 0 :(得分:1)
您可以尝试以下方法:
Calendar createDate = Calendar.getInstance();
Date cDate = createDate.getTime();
GregorianCalendar c = new GregorianCalendar();
c.setTime(cDate);
XMLGregorianCalendar date2 = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
答案 1 :(得分:0)
DatatypeFactory.newInstance().newXMLGregorianCalendar(
GregorianCalendar.from(
ZonedDateTime.now(
ZoneId.of( "Pacific/Auckland" )
)
)
)
XMLGregorianCalendar
,GregorianCalendar
和Calendar
类均表示一个时刻,即日期,一天中的时间和指定的时区。时刻注意时区问题。如果您无法明确寻址区域,则将隐式分配JVM当前的默认时区。
以Continent/Region
的格式指定proper time zone name,例如America/Edmonton
,Africa/Tunis
或Europe/Moscow
。切勿使用2-4个字母的缩写,例如EST
或IST
,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
ZoneId z = ZoneId.of( "America/Montreal" ) ;
如果要使用JVM的当前默认时区,请提出要求并作为参数传递。如果省略,代码将变得难以理解,因为我们不确定您是否打算使用默认值,还是像许多程序员一样不知道该问题。
ZoneId z = ZoneId.systemDefault() ; // Get JVM’s current default time zone.
这些…Calendar
类也很糟糕。 Sun,Oracle和JCP社区几年前通过采用JSR 310放弃了它们……您也应该这样做。仅将 java.time 类用于您的业务逻辑。
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 的旧代码进行交互,请在旧类和现代类之间进行转换。查看添加到旧类中的新方法。
可以通过调用GregorianCalendar.from( ZonedDateTime )
将ZonedDateTime
对象转换为GregorianCalendar
对象(Calendar
的子类)。
GregorianCalendar gregCal = GregorianCalendar.from( zdt ) ;
GregorianCalendar
可以转换为XMLGregorianCalendar
,但是我们必须多做一步。 XMLGregorianCalendar
类本身缺少GregorianCalendar
中的转换器方法。帮助类可以完成工作,DatatypeFactory
,如 java.time 的发明人this Answer在Stephen Colebourne, “JodaStephen”中所示。
XMLGregorianCalendar xmlGregCal = DatatypeFactory.newInstance().newXMLGregorianCalendar( gregCal );
并非我建议这样做,但是您可以将其组合为单层,如顶部 tl; dr 所示。