J'essaie d'obtenir une chaîne d'une date au Java au format spécifié dans HTTP 1.1. Pour autant que je sache, c'est:
Ven, 31 déc 1999 23:59:59 GMT
Le temps étant toujours GMT.
Quelle serait la façon la plus simple d'obtenir cela à partir de Date/Calendrier /?
Au cas où quelqu'un d'autre tenterait de trouver la réponse ici (comme je l'ai fait), voici ce qui fera l'affaire:
String getServerTime() {
Calendar calendar = Calendar.getInstance();
SimpleDateFormat dateFormat = new SimpleDateFormat(
"EEE, dd MMM yyyy HH:mm:ss z", Locale.US);
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
return dateFormat.format(calendar.getTime());
}
afin de configurer le serveur pour parler anglais et donner l'heure dans le fuseau horaire GMT.
ÉDITER:
DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss O")
est la façon de le faire avec Java.time pur. HTTP 1.1 ne correspond pas à 100% avec RFC 112 , donc l'utilisation du formateur Java.time.format.DateTimeFormatter.RFC_1123_DATE_TIME échouera pour un jour du mois inférieur à 10. (grâce à @PavanKamar et @ankon pour l'avoir signalé)
Remarque: pour être rétrocompatible, vous devez également prendre en charge les deux autres formats spécifiés par RFC 2616
Si vous utilisez Joda-Time (que je recommande fortement pour toute gestion des dates et heures en Java), vous pouvez faire:
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
...
private static final DateTimeFormatter RFC1123_DATE_TIME_FORMATTER =
DateTimeFormat.forPattern("EEE, dd MMM yyyy HH:mm:ss 'GMT'")
.withZoneUTC().withLocale(Locale.US);
...
RFC1123_DATE_TIME_FORMATTER.print(new DateTime())
Certaines applications nécessitent que le format inclue un jour du mois à deux chiffres selon RFC7231 . Le Java 8 DateTimeFormatter.RFC_1123_DATE_TIME
Utilise un seul chiffre:
System.out.println(DateTimeFormatter.RFC_1123_DATE_TIME.format(ZonedDateTime.now(ZoneOffset.UTC)));
Sortie: Wed, 1 Aug 2018 14:56:46 GMT
Certaines applications n'aiment pas cela. Avant d'utiliser les anciennes réponses qui utilisent Joda-time ou un pré-Java8 SimpleDateFormat
, voici un Java-8 DateTimeFormatter
fonctionnel:
DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss O")
Maintenant, quand vous faites cela:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss O");
System.out.println(formatter.format(ZonedDateTime.now(ZoneOffset.UTC)));
Vous obtenez Wed, 01 Aug 2018 14:56:46 GMT
- notez le zéro de tête dans le champ du jour du mois.
Si vous, comme moi, essayez de formater un Java 8 Java.time.Instant
vous devez ajouter explicitement le fuseau horaire au formateur. Comme ça:
Instant instant = Instant.now();
String formatted = DateTimeFormatter.RFC_1123_DATE_TIME
.withZone(ZoneOffset.UTC)
.format(instant);
System.out.println(formatted);
Qui imprime:
Mar., 15 mars 2016 14:45:34 GMT
Je sais que c'est une réponse tardive mais je voulais juste l'ajouter pour être complet.
Vous n'avez pas mentionné pour quoi vous avez besoin de la chaîne. Mais si vous en avez besoin pour un en-tête de réponse HTTP, vous pouvez utiliser HttpServletResponse.setDateHeader (). Il fait tout le formatage pour vous.
Calendar calendar = Calendar.getInstance();
SimpleDateFormat dateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z");
System.out.println("Date: " + dateFormat.format(calendar.getTime()));
Vous pouvez jouer avec. La documentation est ici: http://download.Oracle.com/javase/7/docs/api/Java/text/SimpleDateFormat.html