Javaの日時に関する機能を使いこなしましょう – Javaでデスクトップトップアプリ(予定&ToDo管理)を作る-006
今回から、アプリの内部を作っていきます。
スケジュールを管理する上で一番大切なことはなんでしょうか?
それは、日付と時間です。
ということで、日付と時間を司る部分を作っていきます。
Javaで日時を管理する時には、Calendarクラスを利用します。
まずは、Calendarクラスをimportして、Calendar.getInstance()でインスタンスを取り出します。
import java.util.Calendar
Calendar today = Calendar.getInstance();
これで、todayに現在の時刻の情報が入りました。
情報を取り出すには、
today.get(Calendar.YEAR);//年の情報を取り出す
today.get(Calendar.MONTH);//月の情報を取り出す、値は0 ~ 11になるので注意が必要
today.get(Calendar.DATE);//日付の情報を取り出す
today.get(Calendar.DAY_OF_WEEK)//曜日の情報を取り出す
today.get(Calendar.HOUR_OF_DAY);//時を取り出す、24時間制
today.get(Calendar.MINUTE);//分を取り出す
today.get(Calendar.SECOND);//秒を取り出す
today.get(Calendar.WEEK_OF_YEAR)//年の何週目かを取り出す
日付をセットするには、getに似た感じで
today.set(Calendar.YEAR,new_year);//年の情報をnew_yearに書き換える
また、
today.set(year,month,day);
today.set(year,month,day,hourOfDay,minute);
と書くこともできます。monthの値に注意しましょう。
というわけで、Calendarクラスを使って、日時の情報を保持しておくDateクラスを作ります。
[Date.java]
public class Date{
private int year;
private int month;
private int date;
private int hour;
private int minute;
private int week;
Date(int y,int m,int d){
this.year = y;
this.month=m;
this.date=d;
Calendar cal = Calendar.getInstance();
cal.set(y,m-1,d);
this.week=cal.get(Calendar.WEEK_OF_YEAR);
}
Date(int y,int mon,int d,int h,int min){
this.year = y;
this.month=mon;
this.date=d;
this.hour=h;
this.minute=min;
Calendar cal = Calendar.getInstance();
cal.set(y,mon-1,d);
this.week=cal.get(Calendar.WEEK_OF_YEAR);
}
public int getYear(){return this.year; }
public int getMonth(){return this.month; }
public int getDate(){return this.date; }
public int getHour(){return this.hour;}
public int getMinute(){return this.minute;}
public void setDate(int y,int m,int d){
Calendar calendar = Calendar.getInstance();
calendar.set(y,m-1,d);
this.year=calendar.get(Calendar.YEAR);
this.month=calendar.get(Calendar.MONTH)+1;
this.date=calendar.get(Calendar.DATE);
this.week=calendar.get(Calendar.WEEK_OF_YEAR);
}
public void setDate(int y,int mon,int d,int h,int min){
Calendar calendar = Calendar.getInstance();
calendar.set(y,mon-1,d,h,min);
this.year=calendar.get(Calendar.YEAR);
this.month=calendar.get(Calendar.MONTH)+1;
this.date=calendar.get(Calendar.DATE);
this.hour=calendar.get(Calendar.HOUR_OF_DAY);
this.minute=calendar.get(Calendar.MINUTE);
this.week=calendar.get(Calendar.WEEK_OF_YEAR);
}
/*年月日が一致するか比較する、比較されたくない場合は-1を入れる*/
public boolean match(int y,int m,int d){
if(d==-1 && m ==-1){
if((this.year==y)){return true;}
else{return false;}
}else if(d==-1){
if((this.year==y) && (this.month==m)){return true;}
else{return false;}
}else{
if((this.year==y) && (this.month==m) && (this.date==d)){return true;}
else{return false;
}
}
}
/*週が一致するか*/
public boolean matchWeek(int y,int m,int d){
Calendar cal2 = Calendar.getInstance();
cal2.set(y,m-1,d);
if((this.week)==(cal2.get(Calendar.WEEK_OF_YEAR))){return true;}
else{return false;}
}
}
日時の情報をあえて持ちたくない時のために、コンストラクタやメソッドをオーバーロードしています。
この辺は将来的に設計変更を行うかもしれません。
タスクの検索を行うときのためにmatchメッソドを書いていますが、あまり賢いやり方ではないですね。
テストしてみます。
[CalTest.java]
import java.util.Calendar;
public class CalTest{
public static void main(String[] args){
Calendar calendar = Calendar.getInstance();
int year =calendar.get(Calendar.YEAR);
int month =calendar.get(Calendar.MONTH)+1;
int date =calendar.get(Calendar.DATE);
Date today = new Date(year,month,date);
System.out.println("今日の日付"+today.getYear()+"年"+
today.getMonth()+"月"+today.getDate()+"日");
today.setDate(2016,2,23);
System.out.println("2016/2/23にセット");
System.out.println("実行結果"+today.getYear()+"年"+
today.getMonth()+"月"+today.getDate()+"日");
today.setDate(2016,2,29,13,0);
today.setDate((today.getYear()),(today.getMonth()),
(today.getDate()),(today.getHour()+13),(today.getMinute()));
System.out.println("2016/2/29/13:00の13時間後");
System.out.println("実行結果"
+today.getYear()+"年"+today.getMonth()+"月"+today.getDate()+"日"+
today.getHour()+"時"+today.getMinute()+"分");
System.out.println(today.match(2016,-1,-1));//2016年か?true
System.out.println(today.match(2016,4,-1));//2016年4月か?false
System.out.println(today.matchWeek(2016,3,3));
//2016年3月3日は同じ週か?true
System.out.println(today.matchWeek(2016,3,9));
//2016年3月9日は同じ週か?false
}
}
[実行結果]
うまく動きました。
ということで今日はこのへんで。
アプリ開発記の次の記事はこちら => 核となるクラスを設計しましょう – Javaでデスクトップトップアプリ(予定&ToDo管理)を作る-007