Получение даты в формате HTTP на Java - PullRequest
41 голосов
/ 10 октября 2011

Я пытаюсь получить строку даты в Java в формате, указанном в HTTP 1.1.Что, насколько я могу судить, это:

Пт, 31 декабря 1999 23:59:59 GMT

Со временем всегда GMT.

Какой самый простой способ получить это из даты / календаря /?

Ответы [ 8 ]

56 голосов
/ 14 октября 2014

java.time

Если вы используете Java 8 и новее, вы можете использовать предопределенный форматер для RFC 1123 , DateTimeFormatter.RFC_1123_DATE_TIME.

java.time.format.DateTimeFormatter.RFC_1123_DATE_TIME.format(ZonedDateTime.now(ZoneOffset.UTC))
49 голосов
/ 27 декабря 2011

В случае, если кто-то еще попытается найти ответ здесь (как я), вот что поможет:

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

, чтобы настроить сервер на разговор по-английски и указывать время в часовом поясе GMT..

25 голосов
/ 22 июня 2013

Если вы используете Joda-Time (что я настоятельно рекомендую для любой обработки даты и времени в Java), вы можете сделать:

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())
8 голосов
/ 17 апреля 2012

Если вы не боитесь дополнительных зависимостей, вы можете использовать apache DateUtils:

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

Это отформатирует вашу дату в соответствии с RFC 822 RFC1123 .

7 голосов
/ 01 августа 2018

Двузначный день месяца

В некоторых приложениях формат должен включать двухзначный день месяца согласно RFC7231 .Java 8 DateTimeFormatter.RFC_1123_DATE_TIME использует одну цифру:

System.out.println(DateTimeFormatter.RFC_1123_DATE_TIME.format(ZonedDateTime.now(ZoneOffset.UTC)));

Вывод: Wed, 1 Aug 2018 14:56:46 GMT

Некоторым приложениям это не нравится.Прежде чем использовать старые ответы, которые используют Joda-time или pre-java8 SimpleDateFormat, вот рабочая Java-8 DateTimeFormatter:

DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss O")

Теперь, когда выэто:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss O");
System.out.println(formatter.format(ZonedDateTime.now(ZoneOffset.UTC)));

Вы получаете Wed, 01 Aug 2018 14:56:46 GMT - обратите внимание на ведущий ноль в поле дня месяца.

7 голосов
/ 15 марта 2016

Если вы, как и я, пытаетесь отформатировать Java 8 java.time.Instant, вам необходимо явно добавить часовой пояс в форматтер. Как это:

Instant instant = Instant.now();
String formatted = DateTimeFormatter.RFC_1123_DATE_TIME
        .withZone(ZoneOffset.UTC)
        .format(instant);
System.out.println(formatted);

Какие отпечатки:

Вт, 15 марта 2016 14:45:34 GMT

2 голосов
/ 17 марта 2017

Я знаю, что это поздний ответ, но просто хотел добавить его для полноты.

Вы не упомянули, для чего вам нужна строка. Но если вам это нужно для заголовка ответа HTTP, вы можете использовать HttpServletResponse.setDateHeader (). Это делает все форматирование для вас.

2 голосов
/ 10 октября 2011
Calendar calendar = Calendar.getInstance();
SimpleDateFormat dateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z");
System.out.println("Date: " + dateFormat.format(calendar.getTime()));

Вы можете играть с ним. Документация здесь: http://download.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...