Подтвердить что ты не робот

Получение даты в формате HTTP в Java

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

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

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

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

4b9b3361

Ответ 1

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

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.

Ответ 2

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

java.time.format.DateTimeFormatter.RFC_1123_DATE_TIME.format(ZonedDateTime.now(ZoneId.of("GMT")))

Ответ 3

Если вы используете 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())

Ответ 4

Если вы не боитесь дополнительных зависимостей, вы можете использовать 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.

Ответ 5

Если вы, как и я, пытаетесь отформатировать 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

Ответ 6

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

Ответ 7

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

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