web-dev-qa-db-ja.com

JavaでHTTP形式で日付を取得する

Java HTTP 1.1で指定された形式の日付の文字列を取得しようとしています。私が知る限り、これは次のとおりです。

1999年12月31日金曜日23:59:59 GMT

時間は常にGMTです。

Date/Calendar /からこれを取得する最も簡単な方法は何ですか?

42
Fergusmac

他の誰かがここで答えを見つけようとする場合(私がしたように)、ここでトリックが行われます:

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タイムゾーンで時間を与えるように設定するため。

49
Hannes R.

Java.time

編集:

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

純粋なJava.timeでそれを行う方法です。 HTTP 1.1は、 RFC 112 と100%一致しないため、Java.time.format.DateTimeFormatter.RFC_1123_DATE_TIMEフォーマッターを使用すると、10未満の日に対して失敗します(@PavanKamarに感謝)それを指摘してくれた@ankon)

注:後方準拠するには、 RFC 2616 で指定された他の2つの形式もサポートする必要があります。

56
jontejj

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

2桁の日

一部のアプリケーションでは、形式に RFC7231 に従って2桁の曜日を含める必要があります。 Java 8 _DateTimeFormatter.RFC_1123_DATE_TIME_は1桁を使用します:

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

出力:_Wed, 1 Aug 2018 14:56:46 GMT_

一部のアプリケーションはそれを好まない。 Joda-timeまたは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_を取得します-月の日フィールドの先頭のゼロに注意してください。

9
Malt

私のように、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);

どの印刷:

2016年3月15日火曜日14:45:34 GMT

8
K Erlandsson

追加の依存関係を恐れない場合は、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 RFC112

8
om-nom-nom

これは遅い応答であることは知っていますが、完全を期すために追加したかっただけです。

文字列が必要なものについては言及しませんでした。ただし、HTTP応答ヘッダーに必要な場合は、HttpServletResponse.setDateHeader()を使用できます。すべての書式設定が行われます。

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

あなたはそれで遊ぶことができます。ドキュメントはこちらです: http://download.Oracle.com/javase/7/docs/api/Java/text/SimpleDateFormat.html

2
cos