- PR -

Calendar.getTime()メソッドによる値の取得

1
投稿者投稿内容
ペンギン
常連さん
会議室デビュー日: 2003/11/06
投稿数: 39
投稿日時: 2006-01-06 19:15
いつもお世話になっています。
腑におちない事項があるので質問させてください。
OS:Windows2000、開発環境:JDK1.4.2です。

「DB上のある項目について、前月1日以降の値を取得する」
仕様を実装するために、下記のコードを用いて
前月を取得しようと試みました。
内部のしきたりで、PreparedStatementに日時を渡す時は
java.util.Dateを引数にした共通メソッドを使用するので、
最後にjava.util.Date型への変換を試みました。
(日・時分秒のクリアをしていませんが目をつぶってください)

GregorianCalendar lastMCalendar = new GregorianCalendar();
lastMCalendar.add(GregorianCalendar.MONTH, -1);
// この時点でEclipseによるデバッグ機能にて
// lastMCalendarの値を見ると、前月になっている
Date lastMDate = lastMCalendar.getTime();

このとき、lastMDateに現在日付が入ってくるのですが、何故なのでしょうか?
Calendar.getTime()メソッドは、「当該クラスの時刻を取得する」と
読み取りましたが誤りでしょうか?

[ メッセージ編集済み 編集者: ペンギン 編集日時 2006-01-06 19:31 ]
せん
ぬし
会議室デビュー日: 2002/03/04
投稿数: 397
投稿日時: 2006-01-07 08:00
引用:

GregorianCalendar lastMCalendar = new GregorianCalendar();
lastMCalendar.add(GregorianCalendar.MONTH, -1);
// この時点でEclipseによるデバッグ機能にて
// lastMCalendarの値を見ると、前月になっている
Date lastMDate = lastMCalendar.getTime();

このとき、lastMDateに現在日付が入ってくるのですが、何故なのでしょうか?
Calendar.getTime()メソッドは、「当該クラスの時刻を取得する」と
読み取りましたが誤りでしょうか?



今の時間が、「2006/01/10 18:00」と仮定して、
「現在時刻」というものを「18:00」と考えると、
「2006」や「01」や「10」等の年月日が取得出来るのはなんでだろ?

という事と思いますがよろしいですか?

それは、「現在時刻」の解釈の違いかと。

現在時刻は?と聞かれたら「2006/01/10 18:00」です、
と考えれば納得出来る話とおもいます。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-07 08:58
引用:

せんさんの書き込み (2006-01-07 08:00) より:

それは、「現在時刻」の解釈の違いかと。
現在時刻は?と聞かれたら「2006/01/10 18:00」です、
と考えれば納得出来る話とおもいます。


「lastMCalendarの値を見ると、前月になっている」のに、
「現在の日付」が返ってくるのが、疑問なのでは...?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
うみゅ
会議室デビュー日: 2005/10/11
投稿数: 12
投稿日時: 2006-01-09 12:36
PCに入っていた全てのJREで取得できるか確認してみましたが、
先月の日付がlastMDateに取得できてましたよ。

確認したJREの一覧

  • 1.4.2
  • 1.4.2_06
  • 1.4.2_08
  • 1.5.0_02
  • 1.5.0_04
  • 1.5.0_05
  • 1.5.0_06


以下は、検証コードです。
コード:
public class SampleCalendar {
	public static void main(String[] args) throws Exception {

		GregorianCalendar lastMCalendar = new GregorianCalendar();
		lastMCalendar.add(GregorianCalendar.MONTH, -1);
		Date lastMDate = lastMCalendar.getTime();
		
		System.out.println(System.getProperty("java.version"));
		System.out.println(lastMCalendar);
		System.out.println(lastMDate);
	}
}

あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2006-01-09 14:40
引用:
// この時点でEclipseによるデバッグ機能にて
// lastMCalendarの値を見ると、前月になっている
Date lastMDate = lastMCalendar.getTime();


Eclipseのデバッガで追っている時にたまに表示が間違っていたことが
あったような気がします(たぶん勘違いじゃないと思う・・・?)。

でもなぁ。Date lastMDateで宣言している所で間違うのはないかなぁ。
ペンギン
常連さん
会議室デビュー日: 2003/11/06
投稿数: 39
投稿日時: 2006-01-10 19:17
みなさま、お付き合いいただきましてありがとうございます。
結論から申し上げれば、「今日実行したら当該クラスの時刻を取れました」。
お騒がせしてすみませんでした(でも腑に落ちないなぁ…)。

ちなみにこの疑問が発生した仕事に絡んでもう一つ疑問が出たのですが、
「時分秒をクリアするためにはどれだけのフィールドに対して
clear(int)メソッドを実行する必要があるのでしょうか?」
AM_PM/HOUR/MINUTE/SECOND/MILLISECONDをクリアしたのですが、
時フィールドが0にならず残ってしまいました。
(0を直打ちすればいいじゃんと言えばそうなんですが…)
下記実装をしたために解決せずとも済んだのですが、後学のために
お付き合いいただけると幸いです。

実装コードを残しておきます。

コード:
// 前月の年・月を取得
GregorianCalendar tempCal = new GregorianCalendar();
tempCal.add(GregorianCalendar.MONTH, -1);
// tempCal.getTime()の値は質問時点でサーバの日付だったが、
// 今日時点では1ヶ月前になっている!?

// 値のクリアは諦めて1日付けのインスタンスを新規作成
GregorianCalendar lastMCal = new GregorianCalendar(
	tempCal.get(GregorianCalendar.YEAR),
	tempCal.get(GregorianCalendar.MONTH),
	1);

Date lastMDate = lastMCal.getTime();

Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2006-01-11 09:35
HOUR_OF_DAYもクリアしてください。
1

スキルアップ/キャリアアップ(JOB@IT)