Tuesday, February 16, 2010

Model Event Untuk Mendapatkan Range Tanggal, Bulan dan Tahun

Ketika membuat suatu event biasanya kita membutuhkan model untuk mendapatkan rentang tanggal, bulan ataupun tahun. Disini saya sudah membuat class EventModel untuk bisa mendapatkan rentang tanggal, bulan ataupun ahun tadi. Bagi yang membutuhkan silahkan di copy semoga bisa membantu, dan jika ada masukan atau ada algoritma yg lebih efektif silahkan balas thread ini.

Untuk mencoba model ini cukup gampang. Pertama Anda bisa mendefinisikan terlebih dahulu kalender untuk menentukan tanggal awal dan akhir seperti dibawah:
GregorianCalendar awal = new GregorianCalendar();
GregorianCalendar akhir = new GregorianCalendar();
awal.set(2009, 1, 25);
akhir.set(2012, 5, 28);
Lalu buat instan baru EventModel dan masukan tanggal tadi:
EventModel event=new EventModel(awal.getTime(),akhir.getTime());
Kemudian tinggal panggil event.getYearModel() untuk mendapatkan model tahun, event.getMonthModel() untuk model bulan, dan event.getDateModel() untuk model tanggal.
Source lebih lengkapnya ada di halaman berikut.
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;

/**
*
* @author bhangun
*
*/
public class EventModel {
int[] numDays = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
private SimpleDateFormat y;
private SimpleDateFormat m;
private SimpleDateFormat d;
private Integer startMonth;
private Integer startYear;
private Integer startDate;
private Integer endYear;
private Integer endMonth;
private Integer endDate;
private int lengthMonth;
private int lengthYear;
private Integer[][] dateModel;
private Integer[][] monthModel;

/**
* Konstruktor untuk mendapatkan awal dan akhir tanggal
* @param start awal tanggal dengan tipe Date
* @param end akhir tanggal dengan tipe Date
*/
public EventModel(Date start, Date end) {
y = new SimpleDateFormat("yyyy");
m = new SimpleDateFormat("M");
d = new SimpleDateFormat("d");

startYear = Integer.valueOf(y.format(start));
startMonth = (Integer.valueOf(m.format(start))-1);
startDate = (Integer.valueOf(d.format(start))-1);

endYear = Integer.valueOf(y.format(end));
endMonth = (Integer.valueOf(m.format(end))-1);
endDate = (Integer.valueOf(d.format(end))-1);

lengthYear =getYearModel().length;
setMonthModel(getYearModel());
Integer[][] month=getMonthModel();
lengthMonth = monthLength(month);
setDateModel(lengthMonth,startDate,endDate,month);
}

public int getMonthLength(){
return lengthMonth;
}

private int monthLength(Integer[][] month){
int length=0;
for(int i=0;i< month.length;i++){ length+=(month[i][1]-month[i][0])+1; } return length; } /** * Untuk mendapatkan model tahun * @return model tahun dalam bentuk array satu dimensi */ public Integer[] getYearModel() { int l=(endYear-startYear)+1; Integer[] range = new Integer[l]; int n = 0; int ytemp = startYear; if(startYear.equals(endYear)) range[0]=startYear; else while (ytemp <= endYear) { range[n] = ytemp; n++; ytemp++; } return range; } /** * Untuk mendapatkan model bulan dalam bentuk array * @param yearModel model tahun didapatkan dari getYearModel() * @return model bulan dalam bentuk array dua dimensi bertipe dengan format berikut: * getMonthModel()[i][0]=awal bulan, * getMonthModel()[i][1]=akhir bulan, * getMonthModel()[i][2]=tahun */ private void setMonthModel(Integer[] yearModel) { int yearLength = yearModel.length; //System.out.println("length tahun>"+yearLength);

Integer[][] range = new Integer[yearLength][3];
int n = 0;

if (yearLength==1 ) {
//System.out.println("tahun yg sama");
range[n][0]=startMonth;
range[n][1]=endMonth;
range[n][2]=yearModel[0];

} else if (yearLength >1) {
System.out.println("lebih dari 1 tahun");
range[n][0]=startMonth;
range[n][1]=11;
range[n][2]=yearModel[0];
n++;

if (yearLength > 2) {
//System.out.println("lebih dari 2 tahun");
for (int x = 2; x < yearLength; x++) { range[n][0] = 0; range[n][1] = 11; range[n][2] = yearModel[x-1]; n++; } } //--range bulan di tahun terakhir range[n][0]=0; range[n][1]=endMonth; range[n][2]=yearModel[yearLength-1]; } monthModel = range; } public Integer[][] getMonthModel(){ return monthModel; } /** * Untuk mendapatkan model tanggal event dalam bentu array * @param length banyaknya bulan dari awal hingga akhir * @param start awal bulan event * @param end akhir bulan event * @param monthModel model bulan diambil dari getMonthModel() * @return model tanggal dalam bentuk array dua dimensi bertipe integer dengan format berikut: * getDateModel()[i][0]=awal tanggal, * getDateModel()[i][1]=akhir tanggal, * getDateModel()[i][2]=bulan */ private void setDateModel(int length, int start,int end,Integer[][] monthModel) { //System.out.println("length bulan>"+length);
int sufix=1;
int fmonth = monthModel[0][0];
Integer[][] range = new Integer[length][3];
int n = 0;

if (length==1 ) {
//System.out.println("bulan yg sama");
range[n][0]=start+sufix;
range[n][1]=end+sufix;
range[n][2]=fmonth;

} else if (length >1) {
//System.out.println("lebih dari 1 bulan");
range[n][0]=start+sufix;
range[n][1]=daysInMonth(startYear, monthModel[0][0]) ;
range[n][2]=fmonth;
n++;

if (length > 2) {
//System.out.println("lebih dari 2 bulan");

//ditambah 1 untuk mulai dari digit kedua
fmonth++;

for (int x = 2; x < length; x++) { range[n][0] = sufix; int iyear=0; if (fmonth < 12) { range[n][1] = daysInMonth(monthModel[iyear][2],fmonth); range[n][2] = fmonth; fmonth++; } else { fmonth = 0; iyear++; range[n][1] = daysInMonth(monthModel[iyear][2],fmonth); range[n][2] = fmonth; fmonth++; } n++; } } //--range tanggal di bulan terakhir range[n][0]=1; range[n][1]=end+sufix; range[n][2]=monthModel[lengthYear-1][1]; } dateModel = range; } public Integer[][] getDateModel(){ return dateModel; } /** * * @param year * @param month * @return */ public Integer[] getMonth(int year, int month) { GregorianCalendar cal = new GregorianCalendar(); Integer[] days= new Integer[31]; cal.set(year, month, 1); int offset = cal.get(GregorianCalendar.DAY_OF_WEEK) - 1; offset += 7; int num = daysInMonth(year, month); for (int i = 0; i < num; ++i) { days[i]=i + 1; System.out.println(Integer.toString(i + 1)); ++offset; } return days; } /** * * @param year * @return */ public boolean isLeapYear(int year) { if (year % 4 == 0) return true; return false; } /** * * @param year * @param month * @return */ public int daysInMonth(int year, int month) { int days = numDays[month]; if (month == 1 && isLeapYear(year)) ++days; return days; } public static void main(String[] args){ GregorianCalendar awal = new GregorianCalendar(); GregorianCalendar akhir = new GregorianCalendar(); awal.set(2009, 1, 25); akhir.set(2012, 5, 28); System.out.println(awal.getTime()+"-----"+akhir.getTime()); EventModel event=new EventModel(awal.getTime(),akhir.getTime()); System.out.println("Model Tahun:"); Integer[] rangey=event.getYearModel(); for (int i = 0; i < rangey.length; i++) if(rangey[i]!=null) System.out.println("-"+rangey[i]); System.out.println("Model Bulan:"); Integer[][] rangem=event.getMonthModel(); for (int i = 0; i < rangem.length; i++) if(rangem[i][0]!=null) System.out.println(rangem[i][2]+"> " + rangem[i][0]+" - "+rangem[i][1]);

System.out.println("Model Tanggal:");
Integer[][] range=event.getDateModel();
for (int i = 0; i < range.length; i++) if(range[i][0]!=null) System.out.println((i+1)+") bulan : "+range[i][2]+" > " + range[i][0]+" - "+range[i][1]);

}
}

No comments: