■ Java 日付・時刻処理

□ 概要

・日付や時刻の処理は難しいものではないが、出現頻度が高い

・java.util.Dateは、ほとんどのコンストラクタ、メソッドが非推奨になっていて使えない

・主にjava.util.Calendarとjava.text.SimpleDateFormatを使用する
  java.util.Dateも非推奨でないメソッドは使用してもよい

・ロジック的な部分はCalendarで処理し、Stringとの変換ではSimpleDateFormatを使用する

・DateやCalendarは、内部的にはmili secondでデータを保持しているので、場合によっては、日付と時刻をきちんと切り分けて処理する必要がある

・プロジェクトでは、日付・時刻関連の処理は、共通クラスを作成して、他の部分では、その共通クラスを使用することが望ましい


□ 日時→文字列

--
import java.text.SimpleDateFormat;
import java.util.Calendar;

/**
 * Calendar0 日時を取得し表示する
 */
class Calendar0 {
  public static void main(String[] args) {
    // 引数の文字列を変えることにより、いろいろな形で表示できる
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
    Calendar cal = Calendar.getInstance();
    print(sdf.format(cal.getTime()));
    // 一日前に進める
    cal.add(Calendar.DATE, 1);
    print(sdf.format(cal.getTime()));
  }
  private static void print(String s) {
    System.out.println(s);
  }
}
--

□ 文字列→日時

--
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Calendar1 文字列を日時に変換する
 */
class Calendar1 {
  public static void main(String[] args) {
    try {
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
      // 正しい文字列
      String s = "2014/10/25";
      Date date = sdf.parse(s);
      print(date);
      // 正しくない文字列
      s = "2014-10-25";
      date = sdf.parse(s);
      print(date);
    }
    catch(Exception ex) {
      ex.printStackTrace();
    }
    finally {
      // 処理なし
    }
  }
  private static void print(Date date) {
    System.out.println(date.toString());
  }
}
--

□ 日時の比較など

--

import java.util.Calendar;

/**
 * Calendar2 日時の比較などのサンプル
 */
class Calendar2 {
  public static void main(String[] args) {
    Calendar cal0 = Calendar.getInstance();
    Calendar cal1 = Calendar.getInstance();
    //
    print("同じ日時の比較");
    print(cal0.before(cal1));
    print(cal0.equals(cal1));
    print(cal0.after(cal1));
    //
    // 一日前に戻す
    cal0.add(Calendar.DATE, -1);
    print("違う日時の比較");
    print(cal0.before(cal1));
    print(cal0.equals(cal1));
    print(cal0.after(cal1));
  }

  private static void print(boolean b) {
    print(b+"");
  }
  private static void print(String s) {
    System.out.println(s);
  }
}
--

□ ロケール

・ロケールとは地域的・文化的な分類のこと
・日時を文字列で表現する場合にロケールによって形式が異なる
・通貨の単位などもロケールで扱うことができる

・ロケールクラス内に各ロケールを表す定数が定義されている
  日本ではLocale.JAPANとLocale.JAPANESE
  前者は日本国、後者は日本語を意味する

・日付・時刻関連の処理においては、ロケールの考慮が必要な場合があるが、通常の処理であれば、特に意識する必要はない

□ タイムゾーン

・日本国内における通常の日付・時刻処理を行う場合には、タイムゾーンは意識する必要はない

・以外の地域の日付・時刻処理を行う場合には、明示的にタイムゾーンを指定して処理する必要がある。
・タイムゾーンの例

        US/Hawaii            ハワイ標準時
        America/Los_Angeles  太平洋標準時
        America/Belize       中部標準時
        America/New_York     東部標準時
        Europe/London        グリニッジ標準時
        Europe/Paris         中部ヨーロッパ時間
        Africa/Cairo         東ヨーロッパ時間
        Asia/Kuwait          アラビア標準時
        Europe/Moscow        モスクワ標準時
        Asia/Calcutta        インド標準時
        Asia/Singapore       シンガポール時間
        Asia/Tokyo           日本標準時


□ フォーマットする際に指定する記号は、次のようなものを使用できる

        yy    西暦年(2桁)
        yyyy  西暦年(4桁)
        M     月
        MM    月
        D     年に対する日
        DDD   年に対する日
        d     月に対する日
        dd    月に対する日
        w     年に対する週
        W     月に対する週
        E     曜日
        F     月に対する曜日番号
        a     午前午後
        h     時(12時間制)
        hh    時(12時間制)
        H     時(24時間制)
        HH    時(24時間制)
        m     分
        s     秒
        ss    秒
        S     ミリ秒
        SSS   ミリ秒


==
・目次 Java Stringとjava.util
  http://blogs.yahoo.co.jp/artery2020/39979089.html
・目次 - Java言語プログラミング入門
  http://blogs.yahoo.co.jp/artery2020/39975776.html
・目次 - ビジネスパーソンの常識と非常識
  http://blogs.yahoo.co.jp/artery2020/39728331.html
・目次 - 論理・発想・思考についての考察と鍛え方
  http://blogs.yahoo.co.jp/artery2020/39657784.html

== ended.