在java中,当使用SimpleDateFormat和模式时:
yyyy-MM-dd'T'HH:mm:ss.SSSZ
日期输出为:
"2002-02-01T18:18:42.703-0700"
在xquery中,当使用xs:dateTime函数时,它会给出错误:
"Invalid lexical value [err:FORG0001]"
与上述日期。为了让xquery正确解析,日期需要看起来像:
"2002-02-01T18:18:42.703-07:00" - node the ':' 3rd position from end of string
其基于ISO 8601而Java日期基于RFC 822标准。
我希望能够在Java中轻松地指定时区,这样它就能以xquery想要的方式输出。
谢谢!
好的,链接到论坛的帖子确实有帮助,谢谢。然而,我确实找到了一个更简单的解决方案,包括以下内容:
1) 使用Apache commons.lang java库
2) 使用以下java代码:
//NOTE: ZZ on end is not compatible with jdk, but allows for formatting
//dates like so (note the : 3rd from last spot, which is iso8601 standard):
//date=2008-10-03T10:29:40.046-04:00
private static final String DATE_FORMAT_8601 = "yyyy-MM-dd'T'HH:mm:ss.SSSZZ";
DateFormatUtils.format(new Date(), DATE_FORMAT_8601)
关于commons.lang.java的伟大发现!您甚至可以通过以下操作来避免创建自己的格式字符串:
DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.format(new Date());
好吧,我确实遇到了一个问题——在我看来(我可能错了),没有任何方法可以将DateUtils(来自apachecommons-lang)创建的ISO字符串转换回日期
也就是说,apachecommons会按照我想要的方式对其进行格式化,但不会再次将其转换回日期
所以,我切换到了JodaTime,因为它基于ISO8601,所以它要容易得多——下面是代码:
public static void main(String[] args) {
Date date = new Date();
DateTime dateTime = new DateTime(date);
DateTimeFormatter fmt = ISODateTimeFormat.dateTime();
String dateString = fmt.print(dateTime);
System.out.println("dateString=" + dateString);
DateTime dt = fmt.parseDateTime(dateString);
System.out.println("converted date=" + dt.toDate());
}
试试这个:
static public String formatISO8601(Calendar cal) {
MessageFormat format = new MessageFormat("{0,time}{1,number,+00;-00}:{2,number,00}");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
df.setTimeZone(cal.getTimeZone());
format.setFormat(0, df);
long zoneOff = cal.get(Calendar.ZONE_OFFSET) + cal.get(Calendar.DST_OFFSET) / 60000L;
int zoneHrs = (int) (zoneOff / 60L);
int zoneMins = (int) (zoneOff % 60L);
if (zoneMins < 0)
zoneMins = -zoneMins;
return (format.format(new Object[] { cal.getTime(), new Integer(zoneHrs), new Integer(zoneMins) }));
}