`
pengsuyun
  • 浏览: 15125 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

时间工具类,主要用于sql的时间段查询

阅读更多
   该类主要服务于sql中基于时间的统计查询,在写sql的过程中建议不要使用to_char或者to_date等oracle函数这样不利用索引(除非你对to_char进行了类似索引的操作),比如:在表的logintime字段上建立了索引,但是在sql中使用to_char(logintime,'yyyy-MM-dd')作为检索条件的时候,数据库在logintime上建立的索引就没用了。在数据量很大的时候会影响检索的速度。
   该类提供如下方法:
   1、获取系统按天截取时间 getSystemTranceDay();
   2、根据指定时间提供天、周、旬、月、季度、年的开始时间,结束时间(时间格式采java.util.Date),以Date数组的形式返回开始和结束时间。
   3、给定字符串类型的startTime和endTime,工具类负责类型的转换(String转换成Date)
   注意:
   1、在sql中使用开始时间和最后时间的时候,为了保证统计数据的正确性,
     sql按给出的例子组织:t.logintime >= startTime and t.loginTime <= entTime
   2、时间的字符串格式采用 yyyy-MM-dd
   3、使用该类的时候,注意返回结果的正确性,虽然单元测试通过,还是担心有数据不正确的问题。
   4、工具类以附件形式提供。

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.zip.DataFormatException;

import org.apache.commons.lang.time.DateUtils;
import com.pengsy.commons.stringutil.StringUtil;

/**
 * 该类主要服务于sql中基于时间的统计查询,在写sql的过程中建议不要使用to_char或者to_date等oracle函数
 * 这样不利用索引(除非你对to_char进行了类似索引的操作
 * ),比如:在表的logintime字段上建立了索引,但是在sql中使用to_char(logintime,'yyyy-MM-dd')
 * 作为检索条件的时候,数据库在logintime上建立的索引就没用了。在数据量很大的时候会影响检索的速度。
 *  提供如下方法: 
 *  1、获取当前时间(按天截取时间)
 *  2、根据指定时间提供天、周、旬、月、季度、年的开始时间,结束时间(时间格式采java.util.Date)
 *  3、给定字符串类型的startTime和endTime,工具类负责类型的转换(String转换成Date) 
 *  注意:
 *  1、在sql中使用开始时间和最后时间的时候,为了保证统计数据的正确性,
 *    sql按给出的例子组织:t.logintime >= startTime and t.loginTime <= entTime 
 *  2、时间的字符串格式采用 yyyy-MM-dd
 * 
 */

public final class DateUtil {

	private static SimpleDateFormat sDateFormat = new SimpleDateFormat(
			"yyyy-MM-dd");

	public static final int FIRSTTEN = 1 ;
	public static final int MIDTEN = 2;
	public static final int LASTTEN = 3;
	
	public static final int FIRSTQUARTER = 1;
	public static final int SECONDQUARTER = 2;
	public static final int THIRDQUARTER = 3;
	public static final int FORTHQUARTER = 4;
	
	private static Pattern pattern = Pattern
			.compile("^[1-9]\\d{3}-[01]?\\d-[0|1|2|3]?\\d$"); // 2010-12-22

	/**
	 * 获取当前系统时间按天截取的时间
	 * @return
	 */
	public static Date getSystemTranceDay(){
		return DateUtils.truncate(new Date(), Calendar.DATE);
	}
	
	/**
	 * 功能:根据指定时间获取当前天的开始和结束时间,以date数组返回
	 * 逻辑:
	 * 1、appointDate is null ,set default value sysdate
	 * 2、get date[]
	 * @param appointDate
	 * @return
	 */
	public static Date[] getDateArrByDay(Date appointDate){
		Date stime = null;
		Date etime = null;
		Date[] date = new Date[2];
		//未完
		if(appointDate == null){
			appointDate = new Date();
		}
		stime = DateUtils.truncate(appointDate,Calendar.DATE);
		etime = DateUtils.addSeconds(DateUtils.truncate(DateUtils.addDays(appointDate, 1), Calendar.DATE),-1);
		
		date[0] = stime;
		date[1] = etime;
		return date;
	}
	
	/**
	 * 功能:根据指定时间获取当前星期的开始和结束时间,以date数组返回
	 * @param appointDate
	 * @return
	 */
	public static Date[] getDateArrByWeek(Date appointDate){
		Date stime = null;
		Date etime = null;
		Date[] date = new Date[2];
		if(appointDate == null){
			appointDate = new Date();
		}
		
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(appointDate);
		int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
		System.out.println(dayOfWeek);
		
		calendar.add(Calendar.DAY_OF_MONTH, -dayOfWeek+2);
		
		stime = DateUtils.truncate(calendar.getTime(), Calendar.DATE);
		calendar.add(Calendar.DAY_OF_MONTH, 7);
		etime = DateUtils.addSeconds(DateUtils.truncate(calendar.getTime(), Calendar.DATE), -1);
		
		date[0] = stime;
		date[1] = etime;
		
		return date;
	}
	
	/**
	 * 功能:根据指定的时间和上中下旬的其中一个,获取开始时间和结束时间
	 * @param appointDate
	 * @param appointIndex
	 * @return
	 */
	public static Date[] getDateArrByTenDays(Date appointDate,int appointIndex ){
		Date stime = null;
		Date etime = null;
		Date[] date = new Date[2];
		if(appointDate == null){
			appointDate = new Date();
		}
		//init date
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(appointDate);
		int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);
		int maxDayOfMonth = calendar.getMaximum(Calendar.DAY_OF_MONTH);
		
		Date tempDate = DateUtils.truncate(DateUtils.addDays(appointDate, -dayOfMonth + 1), Calendar.DATE);
		
		if(appointIndex == FIRSTTEN){
			stime = tempDate;
			etime = DateUtils.addSeconds(DateUtils.addDays(stime, 10), -1);
		}
		
		if(appointIndex == MIDTEN){
			stime = DateUtils.addDays(tempDate, 10);
			etime = DateUtils.addSeconds(DateUtils.addDays(stime, 10), -1);
		}
		
		if(appointIndex == LASTTEN){
			stime = DateUtils.addDays(tempDate, 20);
			etime = DateUtils.addSeconds(DateUtils.addDays(tempDate, maxDayOfMonth), -1);
		}
		
		date[0] = stime;
		date[1] = etime; 
		return date;
	}
	
	/**
	 * 功能:根据指定时间获取相应月份的开始时间和结束时间
	 * @param appointDate
	 * @return
	 */
	public static Date[] getDateArrByMonth(Date appointDate){
		Date stime = null;
		Date etime = null;
		Date[] date = new Date[2];
		if(appointDate == null){
			appointDate = new Date();
		}
		
		//init date
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(appointDate);
		int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);
		int maxDayOfMonth = calendar.getMaximum(Calendar.DAY_OF_MONTH);
		
		appointDate = DateUtils.truncate(appointDate, Calendar.DATE);
		
		stime = DateUtils.truncate(DateUtils.addDays(appointDate, -dayOfMonth+1), Calendar.DATE);
		etime = DateUtils.addSeconds(DateUtils.addDays(stime, maxDayOfMonth), -1);
		
		date[0] = stime;
		date[1] = etime;
		
		return date;
	}
	
	/**
	 * 功能:根据指定时间所在的当前年,获取指定季度的开始时间和结束时间
	 * @param appointDate 指定当前年
	 * @param appointIndex
	 * @return
	 * @throws IllegalArgumentException
	 */
	public static Date[] getDateArrByQuarter(Date appointDate,int appointIndex) throws IllegalArgumentException{
		Date stime = null;
		Date etime = null;
		Date[] date = new Date[2];
		if(appointDate == null){
			appointDate = new Date();
		}
		int month = appointDate.getMonth();
		Date tempDate = DateUtils.truncate(appointDate, Calendar.YEAR);
		if(appointIndex == FIRSTQUARTER){
			stime = tempDate;
		}else if(appointIndex == SECONDQUARTER){
			stime = DateUtils.addMonths(tempDate, 3);
		}else if(appointIndex == THIRDQUARTER ){
			stime = DateUtils.addMonths(tempDate, 6);
		}else if(appointIndex == FORTHQUARTER){
			stime = DateUtils.addMonths(tempDate, 9);
		}
		etime = DateUtils.addSeconds(DateUtils.addMonths(stime, 3), -1);
		
		date[0] = stime;
		date[1] = etime;
		
		return date;
	}
	
	/**
	 * 功能:根据指定时间,获取年的开始时间和结束时间
	 * @param appointDate
	 * @return
	 */
	public static Date[] getDateArrByYear(Date appointDate){
		Date stime = null;
		Date etime = null;
		Date[] date = new Date[2];
		if(appointDate == null){
			appointDate = new Date();
		}
		stime = DateUtils.truncate(appointDate, Calendar.YEAR);
		etime = DateUtils.addSeconds(DateUtils.addYears(stime, 1), -1);
		
		date[0] = stime;
		date[1] = etime;
		
		return date;
	}
	
	/**
	 * 逻辑: 1、检查startTime,endTime的有效性(是否为空,数据格式), 异常处理: 1、两个参数都为空,抛出空指针异常
	 * 2、数据格式不对,直接抛出 3、一个参数为空,另一个参数格式正确的情况下,为空的参数采用系统时间,为了保证startTime <=
	 * endTime,工具类会做适当的调整 2、转换 3、返回值是个Date[2]数组,date[0] 保存startTime值,date[1]
	 * 保存startTime值,其中startTime <= endTime
	 * 
	 * @param startTime
	 * @param endTime
	 * @return
	 */
	public static Date[] convertDateClass(String startTime, String endTime)
			throws NullPointerException, DataFormatException, ParseException {
		Date stime = null;
		Date etime = null;
		Date[] date = new Date[2];

		if (StringUtil.isEmpty(startTime) && StringUtil.isEmpty(endTime)) {
			throw new NullPointerException("两个参数不能同时为空");
		}

		if (StringUtil.isEmpty(startTime) && !StringUtil.isEmpty(endTime)) {
			// 先判断endTime格式是否正确
			Matcher matcher = pattern.matcher(endTime);
			if (matcher.matches()) {
				stime = DateUtils.truncate(new Date(), Calendar.DATE); // 当天的开始时间,比如:当前时间为2010-12-27 11:31:30 这里stime的时间是2010-12-27 0:0:0
				etime = DateUtils.truncate(sDateFormat.parse(endTime),Calendar.DATE);
			} else {
				throw new DataFormatException(
						"参数endTime的格式不正确!正确的格式 yyyy-MM-dd 比如:2010-12-12!");
			}
		}
		if (!StringUtil.isEmpty(startTime) && StringUtil.isEmpty(endTime)) {
			Matcher matcher = pattern.matcher(startTime);
			if (matcher.matches()) {
				// 提供转换
				etime = DateUtils.truncate(new Date(), Calendar.DATE); // 当天的开始时间,比如:当前时间为2010-12-27 11:31:30 这里stime的时间是2010-12-27 0:0:0
				stime = DateUtils.truncate(sDateFormat.parse(startTime),Calendar.DATE);
			} else {
				throw new DataFormatException(
						"参数startTime的格式不正确!正确的格式 yyyy-MM-dd 比如:2010-12-12!");
			}
		}

		if (!StringUtil.isEmpty(startTime) && !StringUtil.isEmpty(endTime)) {
			Matcher sMatcher = pattern.matcher(startTime);
			Matcher eMatcher = pattern.matcher(endTime);
			if (sMatcher.matches() && eMatcher.matches()) {

				stime = DateUtils.truncate(sDateFormat.parse(startTime),
						Calendar.DATE);
				etime = DateUtils.truncate(sDateFormat.parse(endTime),
						Calendar.DATE);

			} else {
				throw new DataFormatException(
						"请检查参数startTime、endTime的格式是否正确!正确的格式 yyyy-MM-dd 比如:2010-12-12!");
			}

		}

		if (!stime.before(etime)) {
			Date temp = stime;
			stime = etime;
			etime = temp;
			temp = null;
		}
		
		date[0] = stime;
		date[1] = etime;
		return date;
	}
}
分享到:
评论
12 楼 pengsuyun 2010-12-30  
受教了,感谢各位大哥的金玉良言!
11 楼 L--A--N--G 2010-12-29  
建议看看apache.common的时间工具类
10 楼 zero_exia 2010-12-29  
pengsuyun 写道
   该类主要服务于sql中基于时间的统计查询,在写sql的过程中建议不要使用to_char或者to_date等oracle函数这样不利用索引(除非你对to_char进行了类似索引的操作),比如:在表的logintime字段上建立了索引,但是在sql中使用to_char(logintime,'yyyy-MM-dd')作为检索条件的时候,数据库在logintime上建立的索引就没用了。在数据量很大的时候会影响检索的速度。
   该类提供如下方法:
   1、获取系统按天截取时间 getSystemTranceDay();
   2、根据指定时间提供天、周、旬、月、季度、年的开始时间,结束时间(时间格式采java.util.Date),以Date数组的形式返回开始和结束时间。
   3、给定字符串类型的startTime和endTime,工具类负责类型的转换(String转换成Date)
   注意:
   1、在sql中使用开始时间和最后时间的时候,为了保证统计数据的正确性,
     sql按给出的例子组织:t.logintime >= startTime and t.loginTime <= entTime
   2、时间的字符串格式采用 yyyy-MM-dd
   3、使用该类的时候,注意返回结果的正确性,虽然单元测试通过,还是担心有数据不正确的问题。
   4、工具类以附件形式提供。

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.zip.DataFormatException;

import org.apache.commons.lang.time.DateUtils;
import com.pengsy.commons.stringutil.StringUtil;

/**
 * 该类主要服务于sql中基于时间的统计查询,在写sql的过程中建议不要使用to_char或者to_date等oracle函数
 * 这样不利用索引(除非你对to_char进行了类似索引的操作
 * ),比如:在表的logintime字段上建立了索引,但是在sql中使用to_char(logintime,'yyyy-MM-dd')
 * 作为检索条件的时候,数据库在logintime上建立的索引就没用了。在数据量很大的时候会影响检索的速度。
 *  提供如下方法: 
 *  1、获取当前时间(按天截取时间)
 *  2、根据指定时间提供天、周、旬、月、季度、年的开始时间,结束时间(时间格式采java.util.Date)
 *  3、给定字符串类型的startTime和endTime,工具类负责类型的转换(String转换成Date) 
 *  注意:
 *  1、在sql中使用开始时间和最后时间的时候,为了保证统计数据的正确性,
 *    sql按给出的例子组织:t.logintime >= startTime and t.loginTime <= entTime 
 *  2、时间的字符串格式采用 yyyy-MM-dd
 * 
 */

public final class DateUtil {

	private static SimpleDateFormat sDateFormat = new SimpleDateFormat(
			"yyyy-MM-dd");

	public static final int FIRSTTEN = 1 ;
	public static final int MIDTEN = 2;
	public static final int LASTTEN = 3;
	
	public static final int FIRSTQUARTER = 1;
	public static final int SECONDQUARTER = 2;
	public static final int THIRDQUARTER = 3;
	public static final int FORTHQUARTER = 4;
	
	private static Pattern pattern = Pattern
			.compile("^[1-9]\\d{3}-[01]?\\d-[0|1|2|3]?\\d$"); // 2010-12-22

	/**
	 * 获取当前系统时间按天截取的时间
	 * @return
	 */
	public static Date getSystemTranceDay(){
		return DateUtils.truncate(new Date(), Calendar.DATE);
	}
	
	/**
	 * 功能:根据指定时间获取当前天的开始和结束时间,以date数组返回
	 * 逻辑:
	 * 1、appointDate is null ,set default value sysdate
	 * 2、get date[]
	 * @param appointDate
	 * @return
	 */
	public static Date[] getDateArrByDay(Date appointDate){
		Date stime = null;
		Date etime = null;
		Date[] date = new Date[2];
		//未完
		if(appointDate == null){
			appointDate = new Date();
		}
		stime = DateUtils.truncate(appointDate,Calendar.DATE);
		etime = DateUtils.addSeconds(DateUtils.truncate(DateUtils.addDays(appointDate, 1), Calendar.DATE),-1);
		
		date[0] = stime;
		date[1] = etime;
		return date;
	}
	
	/**
	 * 功能:根据指定时间获取当前星期的开始和结束时间,以date数组返回
	 * @param appointDate
	 * @return
	 */
	public static Date[] getDateArrByWeek(Date appointDate){
		Date stime = null;
		Date etime = null;
		Date[] date = new Date[2];
		if(appointDate == null){
			appointDate = new Date();
		}
		
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(appointDate);
		int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
		System.out.println(dayOfWeek);
		
		calendar.add(Calendar.DAY_OF_MONTH, -dayOfWeek+2);
		
		stime = DateUtils.truncate(calendar.getTime(), Calendar.DATE);
		calendar.add(Calendar.DAY_OF_MONTH, 7);
		etime = DateUtils.addSeconds(DateUtils.truncate(calendar.getTime(), Calendar.DATE), -1);
		
		date[0] = stime;
		date[1] = etime;
		
		return date;
	}
	
	/**
	 * 功能:根据指定的时间和上中下旬的其中一个,获取开始时间和结束时间
	 * @param appointDate
	 * @param appointIndex
	 * @return
	 */
	public static Date[] getDateArrByTenDays(Date appointDate,int appointIndex ){
		Date stime = null;
		Date etime = null;
		Date[] date = new Date[2];
		if(appointDate == null){
			appointDate = new Date();
		}
		//init date
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(appointDate);
		int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);
		int maxDayOfMonth = calendar.getMaximum(Calendar.DAY_OF_MONTH);
		
		Date tempDate = DateUtils.truncate(DateUtils.addDays(appointDate, -dayOfMonth + 1), Calendar.DATE);
		
		if(appointIndex == FIRSTTEN){
			stime = tempDate;
			etime = DateUtils.addSeconds(DateUtils.addDays(stime, 10), -1);
		}
		
		if(appointIndex == MIDTEN){
			stime = DateUtils.addDays(tempDate, 10);
			etime = DateUtils.addSeconds(DateUtils.addDays(stime, 10), -1);
		}
		
		if(appointIndex == LASTTEN){
			stime = DateUtils.addDays(tempDate, 20);
			etime = DateUtils.addSeconds(DateUtils.addDays(tempDate, maxDayOfMonth), -1);
		}
		
		date[0] = stime;
		date[1] = etime; 
		return date;
	}
	
	/**
	 * 功能:根据指定时间获取相应月份的开始时间和结束时间
	 * @param appointDate
	 * @return
	 */
	public static Date[] getDateArrByMonth(Date appointDate){
		Date stime = null;
		Date etime = null;
		Date[] date = new Date[2];
		if(appointDate == null){
			appointDate = new Date();
		}
		
		//init date
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(appointDate);
		int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);
		int maxDayOfMonth = calendar.getMaximum(Calendar.DAY_OF_MONTH);
		
		appointDate = DateUtils.truncate(appointDate, Calendar.DATE);
		
		stime = DateUtils.truncate(DateUtils.addDays(appointDate, -dayOfMonth+1), Calendar.DATE);
		etime = DateUtils.addSeconds(DateUtils.addDays(stime, maxDayOfMonth), -1);
		
		date[0] = stime;
		date[1] = etime;
		
		return date;
	}
	
	/**
	 * 功能:根据指定时间所在的当前年,获取指定季度的开始时间和结束时间
	 * @param appointDate 指定当前年
	 * @param appointIndex
	 * @return
	 * @throws IllegalArgumentException
	 */
	public static Date[] getDateArrByQuarter(Date appointDate,int appointIndex) throws IllegalArgumentException{
		Date stime = null;
		Date etime = null;
		Date[] date = new Date[2];
		if(appointDate == null){
			appointDate = new Date();
		}
		int month = appointDate.getMonth();
		Date tempDate = DateUtils.truncate(appointDate, Calendar.YEAR);
		if(appointIndex == FIRSTQUARTER){
			stime = tempDate;
		}else if(appointIndex == SECONDQUARTER){
			stime = DateUtils.addMonths(tempDate, 3);
		}else if(appointIndex == THIRDQUARTER ){
			stime = DateUtils.addMonths(tempDate, 6);
		}else if(appointIndex == FORTHQUARTER){
			stime = DateUtils.addMonths(tempDate, 9);
		}
		etime = DateUtils.addSeconds(DateUtils.addMonths(stime, 3), -1);
		
		date[0] = stime;
		date[1] = etime;
		
		return date;
	}
	
	/**
	 * 功能:根据指定时间,获取年的开始时间和结束时间
	 * @param appointDate
	 * @return
	 */
	public static Date[] getDateArrByYear(Date appointDate){
		Date stime = null;
		Date etime = null;
		Date[] date = new Date[2];
		if(appointDate == null){
			appointDate = new Date();
		}
		stime = DateUtils.truncate(appointDate, Calendar.YEAR);
		etime = DateUtils.addSeconds(DateUtils.addYears(stime, 1), -1);
		
		date[0] = stime;
		date[1] = etime;
		
		return date;
	}
	
	/**
	 * 逻辑: 1、检查startTime,endTime的有效性(是否为空,数据格式), 异常处理: 1、两个参数都为空,抛出空指针异常
	 * 2、数据格式不对,直接抛出 3、一个参数为空,另一个参数格式正确的情况下,为空的参数采用系统时间,为了保证startTime <=
	 * endTime,工具类会做适当的调整 2、转换 3、返回值是个Date[2]数组,date[0] 保存startTime值,date[1]
	 * 保存startTime值,其中startTime <= endTime
	 * 
	 * @param startTime
	 * @param endTime
	 * @return
	 */
	public static Date[] convertDateClass(String startTime, String endTime)
			throws NullPointerException, DataFormatException, ParseException {
		Date stime = null;
		Date etime = null;
		Date[] date = new Date[2];

		if (StringUtil.isEmpty(startTime) && StringUtil.isEmpty(endTime)) {
			throw new NullPointerException("两个参数不能同时为空");
		}

		if (StringUtil.isEmpty(startTime) && !StringUtil.isEmpty(endTime)) {
			// 先判断endTime格式是否正确
			Matcher matcher = pattern.matcher(endTime);
			if (matcher.matches()) {
				stime = DateUtils.truncate(new Date(), Calendar.DATE); // 当天的开始时间,比如:当前时间为2010-12-27 11:31:30 这里stime的时间是2010-12-27 0:0:0
				etime = DateUtils.truncate(sDateFormat.parse(endTime),Calendar.DATE);
			} else {
				throw new DataFormatException(
						"参数endTime的格式不正确!正确的格式 yyyy-MM-dd 比如:2010-12-12!");
			}
		}
		if (!StringUtil.isEmpty(startTime) && StringUtil.isEmpty(endTime)) {
			Matcher matcher = pattern.matcher(startTime);
			if (matcher.matches()) {
				// 提供转换
				etime = DateUtils.truncate(new Date(), Calendar.DATE); // 当天的开始时间,比如:当前时间为2010-12-27 11:31:30 这里stime的时间是2010-12-27 0:0:0
				stime = DateUtils.truncate(sDateFormat.parse(startTime),Calendar.DATE);
			} else {
				throw new DataFormatException(
						"参数startTime的格式不正确!正确的格式 yyyy-MM-dd 比如:2010-12-12!");
			}
		}

		if (!StringUtil.isEmpty(startTime) && !StringUtil.isEmpty(endTime)) {
			Matcher sMatcher = pattern.matcher(startTime);
			Matcher eMatcher = pattern.matcher(endTime);
			if (sMatcher.matches() && eMatcher.matches()) {

				stime = DateUtils.truncate(sDateFormat.parse(startTime),
						Calendar.DATE);
				etime = DateUtils.truncate(sDateFormat.parse(endTime),
						Calendar.DATE);

			} else {
				throw new DataFormatException(
						"请检查参数startTime、endTime的格式是否正确!正确的格式 yyyy-MM-dd 比如:2010-12-12!");
			}

		}

		if (!stime.before(etime)) {
			Date temp = stime;
			stime = etime;
			etime = temp;
			temp = null;
		}
		
		date[0] = stime;
		date[1] = etime;
		return date;
	}
}

9 楼 smallhand 2010-12-29  
mfkvfn 写道
没全部看完。代码质量不高。

执行效率和安全性上都有问题。也多分配了一些多余对象容易引起性能问题。
而且使用了一些第三方类,导致使用你的代码还要引入额外的jar包。

高手,大体浏览下就知道代码的优缺点。希望达到你的层次~
8 楼 iqeq00 2010-12-29  
能不能哪位大虾给个web应用上 完美点的时间处理类
7 楼 topman007 2010-12-29  
运行结果:
dayOfWeek=2
appointDate=2011-01-03 10:35:43
本周开始 date[0]=2011-01-03 00:00:00
本周结束 date[1]=2011-01-09 23:59:59

dayOfWeek=3
appointDate=2011-01-04 10:35:43
本周开始 date[0]=2011-01-03 00:00:00
本周结束 date[1]=2011-01-09 23:59:59

dayOfWeek=4
appointDate=2011-01-05 10:35:43
本周开始 date[0]=2011-01-03 00:00:00
本周结束 date[1]=2011-01-09 23:59:59

dayOfWeek=5
appointDate=2011-01-06 10:35:43
本周开始 date[0]=2011-01-03 00:00:00
本周结束 date[1]=2011-01-09 23:59:59

dayOfWeek=6
appointDate=2011-01-07 10:35:43
本周开始 date[0]=2011-01-03 00:00:00
本周结束 date[1]=2011-01-09 23:59:59

dayOfWeek=7
appointDate=2011-01-08 10:35:43
本周开始 date[0]=2011-01-03 00:00:00
本周结束 date[1]=2011-01-09 23:59:59

dayOfWeek=1
appointDate=2011-01-09 10:35:43
本周开始 date[0]=2011-01-10 00:00:00
本周结束 date[1]=2011-01-16 23:59:59

这个是不是有问题?
凡是dayOfWeek=1 的话,都会有问题!!!
6 楼 无心徘徊 2010-12-29  
pengsuyun 写道
   该类主要服务于sql中基于时间的统计查询,在写sql的过程中建议不要使用to_char或者to_date等oracle函数这样不利用索引(除非你对to_char进行了类似索引的操作),比如:在表的logintime字段上建立了索引,但是在sql中使用to_char(logintime,'yyyy-MM-dd')作为检索条件的时候,数据库在logintime上建立的索引就没用了。在数据量很大的时候会影响检索的速度。
   该类提供如下方法:
   1、获取系统按天截取时间 getSystemTranceDay();
   2、根据指定时间提供天、周、旬、月、季度、年的开始时间,结束时间(时间格式采java.util.Date),以Date数组的形式返回开始和结束时间。
   3、给定字符串类型的startTime和endTime,工具类负责类型的转换(String转换成Date)
   注意:
   1、在sql中使用开始时间和最后时间的时候,为了保证统计数据的正确性,
     sql按给出的例子组织:t.logintime >= startTime and t.loginTime <= entTime
   2、时间的字符串格式采用 yyyy-MM-dd
   3、使用该类的时候,注意返回结果的正确性,虽然单元测试通过,还是担心有数据不正确的问题。
   4、工具类以附件形式提供。

为什么不可以to_date?
logintime > to_date(条件,'yyyy-MM-dd')
5 楼 chanly 2010-12-29  
changyuxin 写道
SimpleDateFormat这个类不是线程安全的,所以在多线程的时候上面的代码可能会出错!
建议用这个包:joda-time


对,webwork jar包里面的那个过滤器里用到了  SimpleDateFormat ,就出现了这个BUG。
struts2 好像修正了这个问题。
4 楼 mfkvfn 2010-12-29  
没全部看完。代码质量不高。

执行效率和安全性上都有问题。也多分配了一些多余对象容易引起性能问题。
而且使用了一些第三方类,导致使用你的代码还要引入额外的jar包。
3 楼 anhaoy 2010-12-29  
changyuxin 写道
SimpleDateFormat这个类不是线程安全的,所以在多线程的时候上面的代码可能会出错!
建议用这个包:joda-time

用 ThreadLocal
这样写:
	private static ThreadLocal<DateFormat> dateFormat = new ThreadLocal<DateFormat>() {
		@Override
		protected DateFormat initialValue() {
			return new SimpleDateFormat("yyyy-MM-dd");
		}
	};
	/**
	 * 格式化日期为  yyyy-MM-dd 格式
	 * @param date
	 * @return
	 */
	public static String formatDate(Date date) {
		return dateFormat.get().format(date);
	}

请大牛评论,这样做在WEB程序中的优劣
2 楼 changyuxin 2010-12-28  
SimpleDateFormat这个类不是线程安全的,所以在多线程的时候上面的代码可能会出错!
建议用这个包:joda-time
1 楼 NakoRuru1982 2010-12-28  
30%~50%的地方可以代码复用

相关推荐

    sql代码格式化工具类

    本工具“sql代码格式化工具类”是专为Java项目设计的,旨在帮助开发者快速有效地对SQL语句进行格式化,提升代码质量和维护效率。 首先,我们要理解SQL格式化的意义。SQL语句通常会因为快速编写或复制粘贴而变得混乱...

    sqlserver脚本查询工具

    总的来说,"sqlserver脚本查询工具"是数据库开发者和管理员的得力助手,它通过自动化查询和定位,显著减少了与数据库对象相关脚本查找的时间和工作量,使得数据库的管理和维护变得更加高效和精确。在日常开发和维护...

    实现ORACLE与SQLSERVER数据库间的数据抽取与转换工具

    总结来说,实现“Oracle与SQLServer数据库间的数据抽取与转换工具”涉及的主要知识点包括:数据库连接、SQL查询、数据转换规则、多数据库系统间的语法差异理解和编程实现。这个工具的源代码压缩包"复件 zExtractor...

    SQL SERVER 操作类(C++)ALM(QC)bug统计小工具

    2 本周修复BUG数 状态为“已修正”或“已关闭”,并此修改时间在周时间段内 注意:检测修改时间段内的BUG 3 严重BUG数 严重程度为PO或P1,并此检测时间在周时间段内 4 否决BUG数 状态为“拒绝”或“已关闭-不是问题...

    SqlServer数据库对应生成c#实体类生成工具

    标题中的“SqlServer数据库对应生成c#实体类生成工具”指的是一个软件工具,它能够自动根据SQL Server数据库中的表结构生成对应的C#实体类代码。这样的工具对于开发人员来说非常实用,因为它大大减少了手动编写这些...

    mss2sql_v5-3.zip SQL Server转换为MySQL工具

    SQL Server转换为MySQL工具,用了一下 感觉蛮不错的。 分享上来,同时也以便记录下来以后自用。 工具名称:Mss2sql 来个操作流程: 下载后打开压缩包 运行mss2sql 默认就是Move to MysQL server ...

    Sqlserver转到MySQL工具

    这类工具的主要目的是帮助用户在不同数据库系统之间进行数据迁移,通常包括数据的导出、转换以及导入过程。 描述中提到的链接(已省略)可能是该工具的使用教程或下载页面,用户可以通过这个链接了解如何操作该工具...

    Microsoft SQL Server数据库建模工具

    可能您的项目已经着手开发一段时间了,即使是这样,您依然可以让本工具为您效劳。您只需打开表字典生成工具,工具会读取数据库中所有的表及字段信息,根据您的配置生成字典。 12、数据库设计文档生成功能。 ...

    SQL连接清除工具

    在IT行业中,数据库管理系统是数据存储和处理的核心,SQL(Structured Query Language)是用于与这些系统交互的标准语言。然而,在多用户环境中,特别是在高并发访问的系统中,可能会出现一些问题,比如“SQL连接...

    数据库时间段合并

    在描述中提到了一个博客链接,虽然没有具体内容,但通常这类博客会介绍一种方法或工具来实现时间段的合并。博主可能会分享一段源码,演示如何在特定的数据库系统(如MySQL, PostgreSQL, Oracle, 或者SQL Server)中...

    Microsoft SQL Server 2008技术内幕:T-SQL查询(第二卷)

    主要内容包括SQL的基础理论、查询优化、查询算法及复杂度,以及在使用子查询、表表达式、排名函数、数据聚合和透视转换、TOP和APPLY、数据修改、分区表、特殊数据结构等实际应用时会遇到的各种高级查询问题和解决...

    SQL格式化工具

    SQL格式化工具是一种专门用于美化和标准化SQL查询代码的软件或在线服务。这些工具能够将杂乱无章、难以阅读的SQL语句整理成整洁、规范的格式,从而提高代码的可读性和可维护性。在数据库管理和开发过程中,保持SQL...

    Java 连续日期周期作为sql查询条件

    综上所述,Java 8的日期时间API为我们提供了强大的工具来处理日期周期,并结合SQL查询进行高效的数据检索。无论你需要按日、月、年还是自定义周期,都有相应的类和方法来帮助你实现。记得在与数据库交互时,始终关注...

    SQL监控工具

    在IT领域,数据库管理和优化是至关重要的工作,而SQL监控工具正是这类工作中的得力助手。本文将深入探讨“SQL监控工具”的应用及其重要性,特别是以“p6spy”为例,来阐述如何利用这样的工具来提升数据库性能和调试...

    SQL Server 数据库检测修复工具.rar

    这些工具可以提供数据库性能指标,如查询执行时间、内存使用情况、I/O瓶颈等,帮助用户优化数据库配置和查询。 6. **数据导入导出工具**:在某些情况下,通过将数据导入到新的、健康的数据库实例中可能是一种有效的...

    SQL安装挂起清除工具

    通过理解和使用这类工具,IT专业人士能够更有效地解决问题,提高工作效率,避免因为安装问题而浪费大量时间。对于初次接触SQL Server安装的用户,理解这种问题及其解决方案是十分必要的,这样可以在遇到类似问题时...

    C和C++常用工具类代码.pdf

    本节的内容涵盖了C和C++语言常用的数据结构和工具类,这些工具类广泛应用于软件开发的不同阶段,从数据存储、处理到界面展示,从命令行参数的解析到代码的自动生成,都能提供极大的便利和效率。掌握这些工具类的使用...

    一种对时间连续数据进行分析查询的SQL扩展语言.pdf

    结构化查询语言SQL作为数据库系统中用于存取数据以及进行数据查询、更新和管理的一种标准编程语言,其功能的扩展意味着用户可以利用更加丰富和灵活的查询语句来处理复杂的查询需求。 根据文章所述,时间序列数据...

    PLSQL隔断时间再执行sql的时候卡死未响应(要等很久才有结果)解决办法

    在使用PL/SQL Developer或其他Oracle数据库管理工具时,可能会遇到一个常见的问题:执行SQL语句或存储过程时,系统长时间无响应或者卡住。这种情况不仅影响工作效率,还会消耗大量的时间和精力去排查原因。本文将...

    简单的SQL连接客户端

    在IT领域,SQL(Structured Query Language)是一种用于管理和处理关系数据库的强大工具,广泛应用于数据查询、更新、插入和删除操作。而"简单的SQL连接客户端"则是一个专为用户设计的轻量级应用,旨在帮助用户方便...

Global site tag (gtag.js) - Google Analytics