3

在 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 想要的方式输出。

谢谢!

4

4 回答 4

4

好的,链接到论坛帖子DID帮助,谢谢。但是,我确实找到了一个更简单的解决方案,其中包括以下内容:

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)  
于 2008-10-03T14:37:28.540 回答
1

好吧,我确实遇到了一个问题 - 在我看来(我可能是错的)没有任何方法可以将 DateUtils(来自 apache commons lang)创建的 ISO 字符串转换回日期!
IE。apache commons 将按照我想要的方式对其进行格式化,但不会再次将其转换回日期

所以,我切换到 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());  
} 
于 2008-10-10T15:27:10.280 回答
1

关于 commons.lang.java 的伟大发现!您甚至可以通过执行以下操作来避免创建自己的格式字符串:

DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.format(new Date());
于 2009-06-29T20:15:46.873 回答
0

尝试这个:

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) }));
}
于 2008-10-03T13:03:56.250 回答