web-dev-qa-db-fra.com

Obtenir la date au format HTTP en Java

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 /?

42
Fergusmac

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.

49
Hannes R.

Java.time

É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

56
jontejj

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())
25
Mark Slater

Jour du mois à deux chiffres

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.

9
Malt

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

8
K Erlandsson

Si vous n'avez pas peur des dépendances supplémentaires, vous pouvez utiliser Apache DateUtils:

import org.Apache.http.impl.cookie.DateUtils;
DateUtils.formatDate(new Date(System.currentTimeMillis()));
// Tue, 17 Apr 2012 18:59:02 GMT

Cela formatera votre date par rapport à RFC 822 RFC112 .

8
om-nom-nom

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.

2
Henry Wilson
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

2
cos