Javaで基本操作シリーズその4、今回は日付、時間の表現。
これ、Date型で昔は全部できたんだけど、今、推奨しないがでる。
GregorianCalendarで操作するのがいいみたいなんだけど、じゃあ、それに変換するには?とか、そういう話。
■はじめに-DateFormatと、それ以外の操作の必要性-
Javaの日付操作について、もし、文字列に変換するだけなら、DateをDateFormatのformatメソッドを使って変換するだけでも、問題はない。
こんなかんじ
import java.util.*; import java.text.*; public class test { public static void main(String[] args) { // まず、フォーマット操作をしたいなら、 // DateFormatをもらわないといけない DateFormat df = DateFormat.getInstance(); // 現在時刻で、Dateを生成してみましょう Date date = new Date(); String StrDate1 = df.format(date); System.out.println("日時:" + StrDate1); } } |
(上記< > ¥は、本当は半角)
しかし、実際に使う場合、年、月、日等を数字で取得したい場合が多い。
このとき、java.util.Dateは、getDate()とか、推奨されてないといことになる。
で、日付を取り出す場合、Calendar.get(取り出したいフィールド)にするわけなんだが、このCalendar(実際にはGregorianCalendar)に、どうやって持っていくか?ということが問題になってくると思う。
今回はその話。
■GregorianCalendarによる日時設定、取得、前・後の比較、日数、月数等の加減
まず、日時操作するときはGregorianCalendarを使う。
このGregorianCalendarはCalendarを継承している。
つまりCalendarのset,getは使えるわけで、
このsetとgetで、年、月、時、分、秒を取得したり、設定したりする。
(Calendarから継承した)before,afterメソッドを使うことによって比較できる。
年月日、時間等を足したり引いたりするには、addメソッドを使う。
表示する場合、getでとってくれば数字になるので、そいつを表示するわけだ。
■GregorianCalendarとDateの変換
でも、受け取るのの多くはjava.util.Dateあるいはjava.sql.Dateなわけで、そーいうとき、GregorianCalendarにするにはどうするの?っていう問題が起こる。
まず、java.util.DateとGregorianCalendarで話を進めよう。
GregorianCalendarのsetTimeメソッドで、Dataの値をGregorianCalendarに設定する
getTimeメソッドでGregorianCalendarからDateの値が取れる。
具体的には、以下のソースを見て欲しい
■サンプルソース
そのGregorianCalendarとDateの変換は、こんなかんじ
import java.util.*; import java.text.*; public class test { public static void main(String[] args) { //==================================// // // // GregorianCalendar=>Date // // // //==================================// // まず、2005年1月1日でGregorianCalendarを生成 // 月は(月だけ)0から始まるので、実際の月(1)-1=0 GregorianCalendar gc = new GregorianCalendar(2005,0,1); // これをgetTimeでDateにして Date date = gc.getTime(); // さっきの方法で表示 DateFormat df = DateFormat.getInstance(); String StrDate1 = df.format(date); System.out.println("Dateで2005年:" + StrDate1); //==================================// // // // Date=>GregorianCalendar // // // //==================================// // 現在の時刻をdateで生成 Date date2 = new Date(); // これを、さっきのgcにセットして、 // 現在の時間にして見ましょう gc.setTime(date2); // 1年先にしてみましょう gc.add(Calendar.YEAR,1); // それをsetでとりだし、表示 System.out.println("GCで2007年"+gc.get(Calendar.YEAR) +"/" + (gc.get(Calendar.MONTH)+1) +"/" + gc.get(Calendar.DATE)); } } |
(上記< > ¥は、本当は半角)
■GregorianCalendarとDateのlong表現
また、java.util.Dateも、java.sql.Dateも、時間をlongで表現でき、
どちらの場合も
getTimeで値を取得、setTimeで値を設定する
注意:GregorianCalendarのgetTime、setTimeと
DateのgetTime、setTimeでは、受け取る/返す値が違うということだ。
そして、GregorianCalendarも
getTimeInMillis()で、値を受け取り、setTimeInMillisで値を取得できる
この機能を使って、java.sql.Dateを設定する
■GregorianCalendarとjava.sql.Dateの変換
java.sql.Dateでは、newするとき、longの値を必要とする
(他の方法は推奨されていない)
なので、GregorianCalendarからjava.sql.Dateは
Date date = new Date(gc.getTimeInMillis());
でいい。
またgetTimeでlongの値を取得できることから、
java.sql.DateからGregorianCalendarは
gc2.setTimeInMillis(date.getTime());
でOK。
日付はsetTimeInMillisにしろ!って書いているので、あえて
触れないけど、java.util.Dateからjava.sql.Dateへの変換、
またはその逆のケースの場合、getTimeでlongの値をとり、
setTimeでその値を取得するっていう形になる。
■サンプルソース
こんなかたち
import java.util.GregorianCalendar; import java.util.Calendar; import java.sql.Date; import java.text.*; public class test { public static void main(String[] args) { //==================================// // // // GregorianCalendar=>Date // // // //==================================// //まず、2005年1月1日でGregorianCalendarを生成 //月は(月だけ)0から始まるので、実際の月(1)ー1=0 GregorianCalendar gc = new GregorianCalendar(2005,0,1); // これをgetTimeInMillisでSQLのDateにして Date date = new Date(gc.getTimeInMillis()); //==================================// // // // Date=>GregorianCalendar // // // //==================================// // 現在の時刻をdateで生成 GregorianCalendar gc2 = new GregorianCalendar(); // これをsetTimeInMillisでセットする gc2.setTimeInMillis(date.getTime()); // 1年先にしてみましょう gc2.add(Calendar.YEAR,1); // それをsetでとりだし、表示 System.out.println("GCで2006年"+gc2.get(Calendar.YEAR) +"/" + (gc2.get(Calendar.MONTH)+1) +"/" + gc2.get(Calendar.DATE)); } } |
(上記< > ¥は、本当は半角)
■注意!
・月について
途中でも書いたが、月は1からでなく、0からはじまっている。
1月のmonthの値は0だ。なので、1足したり引いたりしないといけない
のに注意
・ヘッダーのimportに注意
GregorianCalendarとjava.sql.Dateを使いたいとき
importを、
import java.util.*;
import java.sql.*;
と書いて
Date date = new Date(gc.getTimeInMillis());
としてしまうと、エラーになる。
理由は、java.utilにもDateがあるので、
Dateはjava.util.Dateのことかjava.sql.Dateのことか、分からなくなるから
と、こんなところですかね。