酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Androidで文字列の日付をDate型にパースする(ISO 8601、RFC 1123)

Androidアプリで日時を扱うことが多くなってきました。少し前に「AndroidでHTTPレスポンスヘッダのLast-Modifiedの値を取得する」という記事を書きました。

RFC 2616ではHTTPレスポンスヘッダーに含まれているDateLast-Modifiedの日付はRFC 1123フォーマットで表現しますよと書かれています。ですのでHTTPレスポンスヘッダーの日時をパースするためだけに前回の記事ではRFC 1123フォーマットに限定したものでした。

日時文字列をフォーマットを指定してDate型へパースしたいので、下記のようなメソッドを作成しました。

package jp.ch3cooh.sample.utility;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;
import java.util.TimeZone;

public class DateUtils {

    public static Date fromString(String format, String string) throws ParseException {
        SimpleDateFormat dateFormatter = new SimpleDateFormat(format, Locale.US);
        dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT"));
        dateFormatter.setCalendar(new GregorianCalendar());
        return dateFormatter.parse(string);
    }

}

この DateUtils.fromString メソッドを使ってみましょう。

ISO 8601の場合

日付の表し方といえば一般的にISO 8601のような気がします。Wikipediaにも載っているISO 8601形式の時刻表記例としては下記の通りです。

  • 基本形式
    • 20150701T035640+0900
  • 拡張形式
    • 2015-07-01T03:56:40+09:00

DateUtils.fromStringメソッドを使ってパースするには下記のように書きます。

String stringISO8601 = "2015-06-30T10:00:00+09:00";
Date dateISO8601 = DateUtils.fromString(stringISO8601, "yyyy-MM-dd'T'HH:mm:ssZ");

RFC 1123の場合

前述したようにHTTPレスポンスヘッダーに含まれる日付をパースするときに使用しました。「AndroidでHTTPレスポンスヘッダのLast-Modifiedの値を取得する」に詳細を書いています。

DateUtils.fromStringメソッドを使ってパースするには下記のように書きます。

String stringRFC1123 = "Fri, 26 Jun 2015 06:16:45 GMT";
Date dateRFC1123 = DateUtils.fromString(stringRFC1123, "EEE',' dd MMM yyyy HH:mm:ss zzz");