繁体   English   中英

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

[英]Set XMLGregorianCalendar value from a Calendar date in Java

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

    posting.setXMLGregorianCalendar(message.getCreateDate());

这是我的课:

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; dr

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

片刻需要一个时区

XMLGregorianCalendarGregorianCalendarCalendar类均表示时刻,即日期,一天中的时间和指定的时区。 时刻注意时区问题。 如果您无法明确寻址区域,则将隐式分配JVM的当前默认时区。

Continent/Region的格式指定正确的时区名称 ,例如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.from( ZonedDateTime )

GregorianCalendar gregCal = GregorianCalendar.from( zdt ) ;

可以将GregorianCalendar转换为XMLGregorianCalendar ,但是我们必须XMLGregorianCalendar一步。 XMLGregorianCalendar类本身缺少GregorianCalendar的转换方法。 一个辅助类可以把工作做好, DatatypeFactory ,如在此答案斯蒂芬Colebourne对“JodaStephen” ,java.time的发明者。

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

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

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM