Java日付処理テクニック


Javaの日付処理はやはり面倒です.ruby on railsのように数字の拡張を通じて、かなり便利ではありません.
今週の月曜日、月末、月初めの具体的な時間を知りたいとしたら、5日前は何日ですか.そのため、クラスをパッケージ化しました.内部関数を組み合わせると便利です.
ここの関数の戻り日は秒まで正確であることに注意してください.
getDayBegine()の結果は次のとおりです.
Mon Jun 08 00:00:00:00 CST 2009形式の
getDayEnd()の結果は次のとおりです.
Sun Jun 07 23:59:59 CST 2009形式
くだらないことは言わないで、コードを見て(詳細は簡単です)

package com.snail.gequ.action;

import java.util.Calendar;
import java.util.Date;

import org.apache.log4j.Logger;
import org.hibernate.criterion.Expression;
import org.hibernate.criterion.Projections;

import com.snail.commons.basedao.IBaseDAO;
import com.snail.component.beans.Gequ;
import com.snail.component.beans.Gequzhuanji;
import com.snail.component.beans.Huiyuan;
import com.snail.component.beans.Renqirecord;

public class RenQiRecordUtil {

	private static final long serialVersionUID = 3193922028309094171L;
	private final static Logger logger = Logger
			.getLogger(RenQiRecordUtil.class);


   

	protected Integer getMonthOfThisYear() {
		Calendar cal = Calendar.getInstance();
		cal.setTime(new Date());
		return cal.get(Calendar.MONTH) + 1;

	}

	protected Date getTimeByMonth(Integer month) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(new Date());
		cal.set(Calendar.MONTH, month - 1);
		return cal.getTime();
	}

	protected Date getMonthBegin(Date date) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), 1, 0, 0, 0);
		return cal.getTime();
	}

	protected Date getMonthEnd(Date date) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal
				.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH) + 1, 1, 0,
						0, 0);
		cal.set(Calendar.SECOND, cal.get(Calendar.SECOND) - 1);

		return cal.getTime();
	}
	protected Date getWeekBegin(Date date) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		Date mm=nDaysAgo(cal.get(Calendar.DAY_OF_WEEK)-2,date);
		return getDayBegin(mm);
	}

	protected Date getWeekEnd(Date date) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		Date mm=nDaysAfter(cal.get(8-Calendar.DAY_OF_WEEK),date);
		return getDayEnd(mm);

	}
	protected Date nDaysAfter(int n,Date date) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.set(Calendar.DAY_OF_MONTH, cal.get(Calendar.DAY_OF_MONTH)+n);
		return cal.getTime();
	}

	protected Date getDayBegin(Date date) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
		return cal.getTime();
	}

	protected Date getDayEnd(Date date) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal
				.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH),cal.get(Calendar.DAY_OF_MONTH)+1, 0,
						0, 0);
		cal.set(Calendar.SECOND, cal.get(Calendar.SECOND) - 1);

		return cal.getTime();
	}
   
	protected Date nMonthsAgo(Integer n,Date date) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.set(Calendar.MONTH, cal.get(Calendar.MONTH) - n);
		return cal.getTime();
	}
	protected Date nDaysAgo(Integer n,Date date) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.set(Calendar.DAY_OF_MONTH, cal.get(Calendar.DAY_OF_MONTH) -n);
		return cal.getTime();
	}
	public RenQiRecordUtil() {
		// TODO Auto-generated constructor stub
	}
	

}



次の例を見てみましょう
もし私が先週の初日を手に入れたら、どうやって取りますか?

RenQiRecordUtil util=new RenQiRecordUtil();
System.out.println(util.nDaysAgo(7,util.getWeekBegin(new Date())));


前の週末にペンを手に入れたら?

System.out.println(util.getDayEnd(util.nDaysAgo(1,util.getWeekBegin(new Date()))));