Java/日時操作

Java/日時操作

LocalDateクラス

Java8 からでほかにシガラミが無いならこちらの LocalDate クラスを使おう Java/日時操作/LocalDateクラス

Dateクラス

Dateってなってるけど時刻まで管理できる。

JavaでのDateクラスの位置づけは過去から未来に流れる時間の中の一点を格納する単なる「箱」らしい。 Dateは値であって「表現」では無いというスタンスのようだ。だから数値表現や文字列表現へのメソッドが非推奨になっている

つまり簡単に言うと単にunix時刻が格納されているだけということだ。

現在時刻を得る

引数ナシでnewすると現在時刻で

//Date型で現在日時
Date d = new Date();

日付っぽい文字列から生成する

単に生成する

import java.util.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date hoge = format.parse("2009-10-23");

タイムゾーン指定で生成する

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
format.setTimeZone(TimeZone.getTimeZone("Asia/Tokyo"));
Date hoge = format.parse("2009-10-23");

Dateからタイムゾーン指定で日付を得る

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
format.setTimeZone(TimeZone.getTimeZone("Asia/Tokyo"));
Date hoge = format.parse("2009-10-23");

この時点でまだベトナムは2009年10月22日の深夜である。

ここで取り出す

format.setTimeZone(TimeZone.getTimeZone("Asia/Saigon"));
System.out.println(format.format(hoge)); // => "2009-10-22"

Calendarクラス

時刻を数値や文字列として表現する場合に使うためのラッパー的なクラス?。 時刻の演算機能も備える。 内部に値の保持もできるし、便利な Date として使ってもよさそうなんだが、なんだか位置づけがよくわからん。

・・・と以前書いた通りみなさんそう考えてたようで、Java8 でオワコン。

破壊的なので、パラメータとして使うというより、便利な変換メソッド集としてつかったほうがよいようだ。

各パラメータから Calendar インスタンスを生成する

import java.util.Calendar;
import java.util.GregorianCalendar;
Calendar cal = new GregorianCalendar(2009, 9, 23, 11, 54, 32);

こいつの注意点は月の開始がゼロになっているということ。つまり第二引数に9を指定すると10月を指すことになる。

Calendar同士の過去未来比較

ある時点とその1秒未来を用意

Calendar cal1 = new GregorianCalendar(2009, 9, 23, 11, 54, 32);
Calendar cal2 = new GregorianCalendar(2009, 9, 23, 11, 54, 33);
 
System.out.println(cal1.after(cal2));
System.out.println(cal1.berore(cal2));
自分自身は引数よりも過去ですか? before
自分自身は引数よりも未来ですか? after

これらのメソッドは一致の判定はできない。そこでcompareToというメソッドを使える。

Calendar cal1 = new GregorianCalendar(2009, 9, 23, 11, 54, 32);
Calendar cal2 = new GregorianCalendar(2009, 9, 23, 11, 54, 32);
 
System.out.println(cal1.compareTo(cal2));
 
cal2 = new GregorianCalendar(2009, 9, 23, 11, 54, 33);
System.out.println(cal1.compareTo(cal2));
 
cal2 = new GregorianCalendar(2009, 9, 23, 11, 54, 31);
System.out.println(cal1.compareTo(cal2));

これの出力は

一致 0
自分自身が引数よりも過去 -1 before
自分自身が引数よりも未来 1 after

を返す

覚え方

if(c1.compareTo(c2) < 0){
    //c1のほうが過去
}

いつもこんがらがるので覚え方。compareToの位置に比較演算子を持ってくる感覚↓

if(c1 < c2){
    //c1のほうが過去
}

Calendar型からDate型への変換

Date dNow = new Date();
Calendar cNow = Calendar.getInstance();
cNow.setTime(dNow);
 
Date dNow = cNow.getTime();

Calendar型からsql.Date型への変換

new java.sql.Date(cal.getTime().getTime());

曜日を求める

曜日を求めるのはCalendar型が便利 日曜日から順に1~7の数値で取得できる

Calendar c = Calendar.getInstance();
int dw = c.get(Calendar.DAY_OF_WEEK);

対象の日付の月の1日の一番初めのCalendarインスタンスを作る

public Calendar firstOfMonth(Calendar calendar) {
    Calendar first = Calendar.getInstance();
    first.clear();
    first.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), 1);
    return first;
}

対象の日付の月の一番最後のCalendarインスタンスを作る

public static Calendar lastOfMonth(Calendar calendar) {
    Calendar last = Calendar.getInstance();
    last.clear();
    last.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
    last.set(Calendar.HOUR_OF_DAY, 23);
    last.set(Calendar.MINUTE, 59);
    last.set(Calendar.SECOND, 59);
    last.set(Calendar.MILLISECOND, 999);
    return last;
}

Tags

java/ope/datetime_ope/start.txt · 最終更新: 2019-07-05 19:26 by ore