[Résolu] Génération flux RSS - Format de date

Génération flux RSS - Format de date [Résolu] - Java - Programmation

Marsh Posté le 28-08-2009 à 14:32:58    

Bonjour à tous  :hello: ,
 
Voilà, je vous sollicite sur un problème que je rencontre à l'heure actuelle pour générer un flux RSS en "règles" conformément aux spécifications RSS 2.0
 
Ce problème porte sur les dates et sur la version java utilisée. La date doit respecter la spécification RFC 822.  
 
Avec Java 1.4 et au delà, pas de soucis
 

Code :
  1. SimpleDateFormat RFC822Format = new SimpleDateFormat("E, d MMM yyyy HH:mm:ss Z", java.util.Locale.US);
  2. String formatedDate = RFC822Format.format(new Date());
  3. //renvoie Fri, 28 Aug 2009 14:13:20 +0200


 
Par contre, dans Java 1.3.x le Z qui correspond à la Time zone (ici +0200 = 2 heures HHmm) n'existe pas. Nous avons bien le "petit z"
 

Code :
  1. SimpleDateFormat RFC822Format = new SimpleDateFormat("E, d MMM yyyy HH:mm:ss z", java.util.Locale.US);
  2. String formatedDate = RFC822Format.format(new Date());
  3. //Fri, 28 Aug 2009 14:15:43 CEST


 
Mais le résultat retourné ne satisfait pas la RFC 822 (http://asg.web.cmu.edu/rfc/rfc822.html#sec-5) selon http://validator.w3.org/feed/
 
Ma question est donc la suivante:  
 
Est-il possible de satisfaire la cette spécification RFC 822 pour la mise en forme des dates sur les flux RSS avec java 1.3.1 ? Si oui comment ?
 
Merci par avance.


Message édité par TomZ le 30-08-2009 à 09:59:45
Reply

Marsh Posté le 28-08-2009 à 14:32:58   

Reply

Marsh Posté le 29-08-2009 à 11:36:42    

Tu peux ne pas utiliser SimpleDateFormat pour la partie "Z" et la construire à la main :-/
 
Sinon, quel bien triste contrainte que de devoir utiliser 1.3...
 
N.B. Par convention, les noms de variables ne commencent pas par des majuscules.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 30-08-2009 à 09:56:27    

Bonjour,
 
 
Voici la réponse à ma question effectivement un traitement "à la main" de la partie TimeZone. Ceci est hors contexte programme.
 

Code :
  1. public static String toRFC822(Date d) {
  2.  final long time = d.getTime();
  3.  // On formatte la chaine sans le timezone :
  4.  SimpleDateFormat RFC822Format = new SimpleDateFormat("E, d MMM yyyy HH:mm:ss", java.util.Locale.US);
  5.  String formatedDate = RFC822Format.format(d);
  6.  // On récupère le décallage du timezone pour la date indiqué :
  7.  float offset = RFC822Format.getTimeZone().getOffset(time)/3600000f;
  8.  // On récupère le nombre d'heure et de minutes :
  9.  int hours = (int) offset;
  10.  int minutes = Math.abs( (int) ( 100 * (offset-hours) ));
  11.  // On passe les minutes au format 60 :
  12.  minutes = minutes * 60 / 100;
  13.  // Puis on le formatte comme il faut :
  14.  NumberFormat nf = new DecimalFormat("00" );
  15.  String timezone = nf.format(hours) + nf.format(minutes);
  16.  if (timezone.length()==4) {
  17.   timezone = "+" + timezone;
  18.  }
  19.  return formatedDate + " " + timezone;
  20. }


 
Concernant le nom de la variable SimpleDateFormat, c'est également fourni hors contexte programme. Cette dernière à des majusucles car c'est une static final. En réalité, dans le programme, elle se nomme:

Code :
  1. private static final SimpleDateFormat RFC822_FORMAT = new SimpleDateFormat("E, d MMM yyyy HH:mm:ss Z", java.util.Locale.US);


 
 
Au niveau de la version de Java, le client ayant l'argent, nous sommes donc tributaires des migrations validées ou pas :( (et en ces temps difficiles, ce n'est pas primordial).
 
Merci.

Reply

Marsh Posté le 07-09-2009 à 13:50:44    

Bonjour à tous  :hello: ,
 
Une petite correction pour que la méthode ci-dessous soit totalement Java 1.3 compliant. Il faut utiliser les CALENDAR car la méthode getOffset n'accepte pas uniquement le temps en millisecondes en 1.3
 

Code :
  1. public static String toRFC822(Date _Date) {
  2.  GregorianCalendar vDate = new GregorianCalendar();
  3.    
  4.     vDate.setTime(_Date);
  5.    
  6.  // On formatte la chaine sans le timezone :
  7.  SimpleDateFormat vRFC822Format = new SimpleDateFormat("E, d MMM yyyy HH:mm:ss", java.util.Locale.US);
  8.  String vFormatedDate = vRFC822Format.format(_Date);
  9.   // On récupère le décallage du timezone pour la date indiqué :
  10.  TimeZone vTime = vRFC822Format.getTimeZone();
  11.  float vOffset = vTime.getOffset(
  12.    vDate.get(Calendar.ERA),
  13.    vDate.get(Calendar.YEAR),
  14.    vDate.get(Calendar.MONTH),
  15.    vDate.get(Calendar.DAY_OF_MONTH),
  16.    vDate.get(Calendar.DAY_OF_WEEK),
  17.    vDate.get(Calendar.MILLISECOND))/3600000f;
  18.  // On récupère le nombre d'heures et de minutes :
  19.  int vHours = (int) vOffset;
  20.  int vMinutes = Math.abs( (int) ( 100 * (vOffset-vHours) ));
  21.  // On passe les minutes au format 60 :
  22.  vMinutes = vMinutes * 60 / 100;
  23.  // Puis on le formatte comme il faut :
  24.  NumberFormat vNf = new DecimalFormat("00" );
  25.  String vTimezone = vNf.format(vHours) + vNf.format(vMinutes);
  26.  if (vTimezone.length()==4) {
  27.   vTimezone = "+" + vTimezone;
  28.  }
  29.  return vFormatedDate + " " + vTimezone;
  30. }


 
Merci.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed