menu
書いてる野郎
orebike@gmail.com
Java8 からでほかにシガラミが無いならこちらの LocalDate クラスを使おう Java/日時操作/LocalDateクラス
Dateってなってるけど時刻まで管理できる。
JavaでのDateクラスの位置づけは過去から未来に流れる時間の中の一点を格納する単なる「箱」らしい。 Dateは値であって「表現」では無いというスタンスのようだ。だから数値表現や文字列表現へのメソッドが非推奨になっている
つまり簡単に言うと単にunix時刻が格納されているだけということだ。
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");
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"
時刻を数値や文字列として表現する場合に使うためのラッパー的なクラス?。 時刻の演算機能も備える。 内部に値の保持もできるし、便利な Date として使ってもよさそうなんだが、なんだか位置づけがよくわからん。
・・・と以前書いた通りみなさんそう考えてたようで、Java8 でオワコン。
破壊的なので、パラメータとして使うというより、便利な変換メソッド集としてつかったほうがよいようだ。
import java.util.Calendar; import java.util.GregorianCalendar;
Calendar cal = new GregorianCalendar(2009, 9, 23, 11, 54, 32);
こいつの注意点は月の開始がゼロになっているということ。つまり第二引数に9を指定すると10月を指すことになる。
ある時点とその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のほうが過去 }
Date dNow = new Date(); Calendar cNow = Calendar.getInstance(); cNow.setTime(dNow); Date dNow = cNow.getTime();
new java.sql.Date(cal.getTime().getTime());
曜日を求めるのはCalendar型が便利 日曜日から順に1~7の数値で取得できる
Calendar c = Calendar.getInstance(); int dw = c.get(Calendar.DAY_OF_WEEK);
public Calendar firstOfMonth(Calendar calendar) { Calendar first = Calendar.getInstance(); first.clear(); first.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), 1); return first; }
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; }