2008-10-03 14 views
3

En java, lorsque vous utilisez SimpleDateFormat avec le motif:format de date java incompatible avec xquery xs: format de date, comment résoudre ce problème?

yyyy-MM-dd'T'HH:mm:ss.SSSZ 

la date est délivrée comme:

"2002-02-01T18:18:42.703-0700" 

En XQuery, lorsque vous utilisez les xs: fonction dateTime, il donne l'erreur:

"Invalid lexical value [err:FORG0001]" 

avec la date ci-dessus. Pour XQuery pour analyser correctement, la date doit ressembler:

"2002-02-01T18:18:42.703-07:00" - node the ':' 3rd position from end of string 

qui est basé sur la norme ISO 8601, alors que la date Java est basé sur la norme RFC 822.

Je voudrais être capable de spécifier facilement le fuseau horaire en Java afin qu'il produise la façon dont xquery veut.

Merci!

Répondre

0

Essayez ceci:

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

Cette réponse semble être exacte, mais il semble aussi être une copie de « la réponse » au poste de forum que Jasper a souligné , sans crédit donné. Si vous codez le berceau, donnez du crédit! Et si vous avez utilisé la réponse de quelqu'un d'autre pour y arriver, donnez-leur aussi du crédit. –

+0

Il semble qu'il manque également des millisecondes dans le format. –

4

OK, le lié au poste de forum a aidé, je vous remercie. J'ai cependant trouvé une solution plus simple, que j'inclus ci-dessous:

1) Utiliser la bibliothèque java Apache
2) Utilisez le code java suivant:

//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) 
+0

Je suis content que vous ayez résolu votre propre problème, je ne savais pas que la bibliothèque des communs contenait aussi un formateur de date. – Jasper

1

Eh bien, je ne courir dans un problème - il ne me semble pas (et je pourrais me tromper) qu'il y avait un moyen de convertir à partir de ISO et de la chaîne que DateUtils (depuis apache commons lang) crée, de retour à une date!
ie. communes apache formateront la façon dont je voudrais, mais pas le reconvertir à une date encore

Alors, je suis passé à JodaTime, et son beaucoup plus facile depuis son basée sur ISO8601 - voici le code:

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

Grande trouvaille concernant commons.lang.java! Vous pouvez même vous sauver de créer votre propre chaîne de format en procédant comme suit:

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