ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

Javaで基本操作(その4):日時操作(GregorianCalendarで操作、Dateを変換)

2006-08-28 16:00:35 | JavaとWeb

 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のことか、分からなくなるから

と、こんなところですかね。

この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« パッケージ販売より、ネット... | トップ | オーマイニュース、今日、創... »
最新の画像もっと見る

JavaとWeb」カテゴリの最新記事