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

时间:2019-04-01 12:12:45

标签: java date calendar xmlgregoriancalendar

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

    posting.setXMLGregorianCalendar(message.getCreateDate());

这是我的课:

Message.java

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

2 个答案:

答案 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)

tl; dr

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

片刻需要一个时区

XMLGregorianCalendarGregorianCalendarCalendar类均表示一个时刻,即日期,一天中的时间和指定的时区。时刻注意时区问题。如果您无法明确寻址区域,则将隐式分配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

这些…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 AnswerStephen Colebourne, “JodaStephen”中所示。

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

并非我建议这样做,但是您可以将其组合为单层,如顶部 tl; dr 所示。

enter image description here