ZonedDateTime 中的 XMLGregorianCalendar 格式日期
XMLGregorianCalendar format date in ZonedDateTime
我有一个函数,它接受日期并给出 XMLGregorianCalendar 格式的日期,如下所示,当日期提供为 2017-11-30
时,returns 日期为 2017-11-30T00:00:00.000-08:00
public static String xmlDate(Date date) {
XMLGregorianCalendar xmlDate = null;
if (date != null) {
GregorianCalendar gc = new GregorianCalendar();
Calendar cal = Calendar.getInstance();
cal.setTime(date);
gc.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));
gc.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
gc.set(Calendar.MILLISECOND, 0);
try {
xmlDate = DatatypeFactory.newInstance().newXMLGregorianCalendar(gc);
} catch (DatatypeConfigurationException e) {
//exception
}
}
return xmlDate.toString();
}
我正在尝试用 Java 8 ZonedDateTime 重写上面的函数,但得到的日期是 2017-11-29T00:00:00-08:00
。我怎样才能得到与上面函数相同的精确输出?我也不明白为什么日期是 29 而不是 30。
public static String zonedDatetime(Date date) {
return ZonedDateTime.ofInstant(date.toInstant(), ZoneId.of("America/Los_Angeles"))
.truncatedTo(ChronoUnit.DAYS)
.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
}
假设 date
是现在,那么你得到 29 号的原因是因为那是此时洛杉矶的日期(太平洋标准时间 22:53)。
如果你想匹配本地日期,那么你可能正在寻找这样的东西:
return ZonedDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault())
.withZoneSameLocal(ZoneId.of("America/Los_Angeles"))
.truncatedTo(ChronoUnit.DAYS)
.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME)
我有一个函数,它接受日期并给出 XMLGregorianCalendar 格式的日期,如下所示,当日期提供为 2017-11-30
2017-11-30T00:00:00.000-08:00
public static String xmlDate(Date date) {
XMLGregorianCalendar xmlDate = null;
if (date != null) {
GregorianCalendar gc = new GregorianCalendar();
Calendar cal = Calendar.getInstance();
cal.setTime(date);
gc.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));
gc.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
gc.set(Calendar.MILLISECOND, 0);
try {
xmlDate = DatatypeFactory.newInstance().newXMLGregorianCalendar(gc);
} catch (DatatypeConfigurationException e) {
//exception
}
}
return xmlDate.toString();
}
我正在尝试用 Java 8 ZonedDateTime 重写上面的函数,但得到的日期是 2017-11-29T00:00:00-08:00
。我怎样才能得到与上面函数相同的精确输出?我也不明白为什么日期是 29 而不是 30。
public static String zonedDatetime(Date date) {
return ZonedDateTime.ofInstant(date.toInstant(), ZoneId.of("America/Los_Angeles"))
.truncatedTo(ChronoUnit.DAYS)
.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
}
假设 date
是现在,那么你得到 29 号的原因是因为那是此时洛杉矶的日期(太平洋标准时间 22:53)。
如果你想匹配本地日期,那么你可能正在寻找这样的东西:
return ZonedDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault())
.withZoneSameLocal(ZoneId.of("America/Los_Angeles"))
.truncatedTo(ChronoUnit.DAYS)
.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME)