从 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 Calendar
class这些都代表一个时刻,即日期、时间和分配的时区。请注意时区问题。如果您未能显式指定时区,则将隐式分配 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.
java.time
这些…Calendar
class也很糟糕。多年前,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 部分所示。
从日历日期设置 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 Calendar
class这些都代表一个时刻,即日期、时间和分配的时区。请注意时区问题。如果您未能显式指定时区,则将隐式分配 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.
java.time
这些…Calendar
class也很糟糕。多年前,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
XMLGregorianCalendar xmlGregCal = DatatypeFactory.newInstance().newXMLGregorianCalendar( gregCal );
不是我推荐它,但您可以将它组合成一个单行,如顶部 tl;dr 部分所示。