- PR -

日付の計算で質問です。

1
投稿者投稿内容
アマ
会議室デビュー日: 2004/08/17
投稿数: 12
お住まい・勤務地: コンクリートジャングル
投稿日時: 2005-05-27 20:32
日付を引き算していると気になることがありました。
4月30日からループで1日ずつ引いていくと、
3月31日が登場しません。
これはどういうことなのでしょうか?
誰か教えてください。
宜しくお願いいたします。

コード:
import java.util.GregorianCalendar;

public class Test {

	public static void main(String[] args) {
		//これが基準日
		String toYYYYMMDD = "20050430";

		//30日前の取得
		GregorianCalendar cl30 = new GregorianCalendar();
		cl30.set(
			Integer.parseInt(toYYYYMMDD.substring(0,4)), 
			Integer.parseInt(toYYYYMMDD.substring(4,6)), 
			Integer.parseInt(toYYYYMMDD.substring(6,8)));

		//だらだらと出してみる
		for (int i = 0; i <= 31; i++) {
			cl30.add(GregorianCalendar.DATE, -1);
			String testDay = 
				cl30.get(GregorianCalendar.YEAR) + "/" + 
				cl30.get(GregorianCalendar.MONTH) + "/" +
				cl30.get(GregorianCalendar.DATE);

			System.out.println("-*-*-*-*-*-*-*-*-*-*");
			System.out.println(i + ":" + testDay);
			System.out.println("-*-*-*-*-*-*-*-*-*-*");
		}
	}
}



結果の一部です。
・・・
-*-*-*-*-*-*-*-*-*-*
27:2005/4/2
-*-*-*-*-*-*-*-*-*-*
-*-*-*-*-*-*-*-*-*-*
28:2005/4/1
-*-*-*-*-*-*-*-*-*-*
-*-*-*-*-*-*-*-*-*-*
29:2005/3/30
-*-*-*-*-*-*-*-*-*-*
-*-*-*-*-*-*-*-*-*-*
30:2005/3/29
-*-*-*-*-*-*-*-*-*-*
-*-*-*-*-*-*-*-*-*-*
31:2005/3/28
-*-*-*-*-*-*-*-*-*-*
ykhr
会議室デビュー日: 2004/11/12
投稿数: 18
投稿日時: 2005-05-27 21:05
答えは、ここらへんでしょうか・・・

http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/util/Calendar.html#MONTH
アマ
会議室デビュー日: 2004/08/17
投稿数: 12
お住まい・勤務地: コンクリートジャングル
投稿日時: 2005-05-28 15:28
引用:

未記入Yさんの書き込み (2005-05-27 21:05) より:
答えは、ここらへんでしょうか・・・

http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/util/Calendar.html#MONTH



すみません。
理解できませんでした。
教えていただけないでしょうか。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-05-28 15:49
つまり、
引用:

-*-*-*-*-*-*-*-*-*-*
27:2005/4/2
-*-*-*-*-*-*-*-*-*-*
-*-*-*-*-*-*-*-*-*-*
28:2005/4/1
-*-*-*-*-*-*-*-*-*-*
-*-*-*-*-*-*-*-*-*-*
29:2005/3/30
-*-*-*-*-*-*-*-*-*-*
-*-*-*-*-*-*-*-*-*-*
30:2005/3/29
-*-*-*-*-*-*-*-*-*-*
-*-*-*-*-*-*-*-*-*-*
31:2005/3/28
-*-*-*-*-*-*-*-*-*-*


と表示されていますが、Javaのカレンダークラスでは、
月は0から始まりますので、
コード:
-*-*-*-*-*-*-*-*-*-* 
27:2005/5/2 
-*-*-*-*-*-*-*-*-*-* 
-*-*-*-*-*-*-*-*-*-* 
28:2005/5/1 
-*-*-*-*-*-*-*-*-*-* 
-*-*-*-*-*-*-*-*-*-* 
29:2005/4/30 
-*-*-*-*-*-*-*-*-*-* 
-*-*-*-*-*-*-*-*-*-* 
30:2005/4/29 
-*-*-*-*-*-*-*-*-*-* 
-*-*-*-*-*-*-*-*-*-* 
31:2005/4/28 
-*-*-*-*-*-*-*-*-*-*


というような出力が実際の日付です。
ですので[4/31]がないので、あなたのプログラム上では
[3/31]が表示されないのです。
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2005-05-28 15:50
じゃ、
http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/util/Calendar.html#set(int,%20int,%20int)
これ?
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2005-05-28 15:54
先を越された。

言い換えると、
set(2005, 4, 30)
は、
set(2005, Calendar.MAY, 30)
だということです。
アマ
会議室デビュー日: 2004/08/17
投稿数: 12
お住まい・勤務地: コンクリートジャングル
投稿日時: 2005-05-28 16:03
なるほど!!!
日は1から始まるけど、月は0から始まるから、
そこでずれてたってことですね!!!!
おかげ様で思い通りに出来ました!!!!!
ありがとうございました!!!!!!
1

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