Java формат даты несовместим с xquery xs: формат даты, как исправить?

В 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 ответа

ОК, связанная с форумом DID помощь, спасибо. Однако я нашел более простое решение, которое я включил ниже:

1) Используйте java-библиотеку Apache commons.lang 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)


Ну, я столкнулся с проблемой - мне не кажется (и я могу ошибаться), что есть какой-то способ конвертировать из и строку ISO, что DateUtils (из apache commons lang) создает, обратно дата! то есть. 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()); 
}


Отличная находка относительно commons.lang.java! Вы даже можете спасти себя от создания собственной строки формата, выполнив следующие действия:

DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.format(new Date());


Попробуйте следующее:

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) }));
}

licensed under cc by-sa 3.0 with attribution.