Java的日期时间相关的实用片段代码

在Java进行项目开发中相信都经常遇到处理日期和时间的问题,根据经验和过往开发整理一下一些比较经常用到方法和代码片段,更多可自行丰富修改,方便日后参考使用,嘿嘿,懒人计划,硬核如下... 

一,各代码片段

//解析符合格式的日期字符串,返回日期类型
//日期格式: yyyy-MM-dd HH:mm:ss 或 yyyy/MM/dd HH:mm:ss
package com.xx.yy.zz.util;

import java.util.Date;
import java.text.SimpleDateFormat;

public static Date parseDate(String dateTime){
	if (null == dateTime || dateTime.trim().isEmpty()){
		return null;
	}
	SimpleDateFormat sdFromat1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	SimpleDateFormat sdFromat2 = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
	if (dateTime.indexOf("/") > 0) {
		return sdFromat2.parse(dateTime);
	} else {
		return sdFromat1.parse(dateTime);
	}	
}
//获取日期的的年月日时分秒毫秒yyyyMMddHHmmssSSS字符串
//如果参数为null则日期为当前日期
package com.xx.yy.zz.util;

import java.util.Date;
import java.text.SimpleDateFormat;

public static String getStrDateYyyyMMddHHmmssSSS(Date date){
	if (null == date) {
		date = Calendar.getInstance().getTime();
	}
	SimpleDateFormat sdFromat = new SimpleDateFormat("yyyyMMddHHmmssSSS");
	return sdFromat.format(date);
}
//获取日期的的年月日时分秒yyyy-MM-dd HH:mm:ss字符串
//如果参数为null则日期为当前日期
package com.xx.yy.zz.util;

import java.util.Date;
import java.text.SimpleDateFormat;

public static String getStrDateYyyyMMddHHmmss(Date date){
	if (null == date) {
		date = Calendar.getInstance().getTime();
	}
	SimpleDateFormat sdFromat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	return sdFromat.format(date);
}
//获取日期的的年月日yyyy-MM-dd字符串
//如果参数为null则日期为当前日期
package com.xx.yy.zz.util;

import java.util.Date;
import java.text.SimpleDateFormat;

public static String getStrDateYyyyMMdd(Date date){
	if (null == date) {
		date = Calendar.getInstance().getTime();
	}
	SimpleDateFormat sdFromat = new SimpleDateFormat("yyyy-MM-dd");
	return sdFromat.format(date);
}
//判断指定日期是不是当月的最后一天
//入参为空就是当天,
//返回true=是月末最后一天,false=非月末最后一天
package com.xx.yy.zz.util;

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

public static boolean isLastDayOfMonth(Date date){
	Calendar calendar = Calendar.getInstance();
	if (null == date) {
		calendar.setTime(new Date());
	} else {
		calendar.setTime(date);
	}
	calendar.set(Calendar.DATE,(calendar.get(Calendar.DATE))+1);
	if (1 == calendar.get(Calendar.DAY_OF_MONTH)) {
		return true;
	} else {
		return false;
	}
}
//获取指定日期所属月的最后一天的日期和时间
//如果参数为null则日期为当前日期
package com.xx.yy.zz.util;

import java.util.Date;
import java.util.Calendar;
public static Date getLastDateOfMonth(Date date){
	if (null == date){
		date = Calendar.getInstance().getTime();
	}
	Calendar calendar = Calendar.getInstance();
	calendar.setTime(date);
	calendar.set(Calendar.DATE, 1);
	//roll方法获取最后一天,但时间跟当前日期的时间一样
	calendar.roll(Calendar.DATE, -1); 
	String tempDTime = getStrDateYyyyMMdd(calendar.getTime());
	tempDTime = tempDTime + " 23:59:59";
	return parseDate(tempDTime);	
}
//判断targetDate是否在起始和结束时间范围(含)内
//返回, true=是在范围内,false=不在范围内
package com.xx.yy.zz.util;

import java.util.Date;

public static boolean isMiddleOfTwoDate(Date startDate, Date endDate, Date targetDate){
	if (null == startDate || null == endDate || null == targetDate){
		return false;
	}
	long startDateNum = startDate.getTime();
	long endDateNum = endDate.getTime();
	long targetDateNum = targetDate.getTime();
	if(startDateNum <= targetDateNum && targetDateNum <= endDateNum){
		return true;
	}
	return false;
}
//计算两个日期之间间隔有多少天,
//注意:如果包含头或尾的一天则自行加一,本方法仅计算两个日期中间的天数
package com.xx.yy.zz.util;

import java.text.DecimalFormat;
import java.text.Format;
import java.util.Calendar;
import java.util.Date;

public static long getDaysOfTwoDate(Date startDate, Date endDate){
	if (null == startDate || null == endDate){
		return 0;
	}
	Calendar calendar = Calendar.getInstance();
	calendar.setTime(startDate);
	long num1 = calendar.getTimeInMillis();
	calendar.setTime(endDate);
	long num2 = calendar.getTimeInMillis();
	long diff = Math.abs(num2 - num1);
	double days = (diff / 1000) / (1*24*60*60);
	//仅仅计算整数部分
	DecimalFormat numFormat = new DecimalFormat("#"); 
	return Long.valueOf(numFormat.format(days));		
}
//序列日期相关的Bean
package com.xx.yy.zz.model;

import java.util.Date;

public class SnDateVo {
	/** 月或周的序列 */
	private Integer dateSn;
	
	/** 月或周的序列名称 */
	private String dateSnName;
	
	/** 开始日期 */
	private Date startDate;
	
	/** 结束日期 */
	private Date endDate;
	
	/** 开始和结束日期内的天数 */
	private Integer dayNumber;
	
	// ... 构造函数/setter/getter省略...
}
//计算并返回两个日期之间各个月份的数据,
//注意: 各个月从1日的00:00:00到本月最后一天的23:59:59
//原理根据时间按秒数不断加一使时间向前滚动来计算
package com.xx.yy.zz.util;

import java.util.Calendar;
import java.util.Date;
import java.util.List;
import com.xx.yy.zz.model.SnDateVo;

public static List<SnDateVo> getMonthData(Date startDate, Date endDate){
	List<SnDateVo> monthDatas = new ArrayList<SnDateVo>();
	if (null == startDate || null == endDate){
		return monthDatas;
	}
	//第一个月
	String monthSn = "X月份";
	Calendar calendar = Calendar.getInstance();
	calendar.setTime(startDate);
	int startMonth = calendar.get(Calendar.MONTH);
	SnDateVo dateVo = new SnDateVo();
	dateVo.setDateSn(startMonth + 1); //用户看的需要加1符合实际
	dateVo.setDateSnName(monthSn.replace("X",(startMonth + 1)+"");
	dateVo.setStartDate(startDate);
	Date tempDate = getLastDateOfMonth(startDate);
	boolean isEnd = false;
	if (tempDate.before(endDate)) {
		isEnd = false;
		dateVo.setEndDate(tempDate);
		calendar.setTime(tempDate);
	} else {
		isEnd = true;
		dateVo.setEndDate(endDate);
	}
	int tempDays = Integer.valueOf(getDaysOfTwoDate(dateVo.getStartDate(),dateVo.getEndDate()) + "") + 1;
	dateVo.setDayNumber(tempDays);
	monthDatas.add(dateVo);
	//第二个以及之后的月份	
	if (isEnd){
		return monthDatas;
	}
	int tempSn = 0;
	int sn = 1;
	while(true){
		SnDateVo xDateVo = new SnDateVo();
		tempSn = startMonth + 1 + sn;
		xDateVo.setDateSn(startMonth + 1); 
		xDateVo.setDateSnName(monthSn.replace("X",tempSn+"");
		calendar.add(Calendar.SECOND, 1); //时间秒数加一
		tempDate = getLastDateOfMonth(calendar.getTime());
		if (tempDate.before(endDate)) {
			sn = sn +1;
			xDateVo.setEndDate(tempDate);
			tempDays = Integer.valueOf(getDaysOfTwoDate(xDateVo.getStartDate(),xDateVo.getEndDate()) + "") + 1;
			xDateVo.setDayNumber(tempDays);
			monthDatas.add(xDateVo);
			calendar.setTime(tempDate);	//本次最后的日期设置到日期对象中
		} else {
			xDateVo.setEndDate(endDate);
			tempDays = Integer.valueOf(getDaysOfTwoDate(xDateVo.getStartDate(),xDateVo.getEndDate()) + "") + 1;
			xDateVo.setDayNumber(tempDays);
			monthDatas.add(xDateVo);
			break;
		}
	}
	return monthDatas;
}
//计算并返回两个日期之间各个周的数据,
//注意: 按我国用户习惯各个周从周一的00:00:00到本周日的23:59:59结束
//原理根据时间按秒数不断加一使时间向前滚动来计算
package com.xx.yy.zz.util;

import java.util.Calendar;
import java.util.Date;
import java.util.List;
import com.xx.yy.zz.model.SnDateVo;

public static List<SnDateVo> getWeekData(Date startDate, Date endDate){
	List<SnDateVo> weekDatas = new ArrayList<SnDateVo>();
	if (null == startDate || null == endDate){
		return weekDatas;
	}
	//第一个周
	String weekSn = "第X周";	
	int startWeek = 1;
	SnDateVo dateVo = new SnDateVo();
	dateVo.setDateSn(startWeek); 
	dateVo.setDateSnName(weekSn.replace("X",startWeek+"");
	dateVo.setStartDate(startDate);
	Calendar calendar = Calendar.getInstance();
	calendar.setTime(startDate);	
	Date tempDate = calendar.getTime();
	//注意Java中定义一周从周日的0时开始,对应数值1,周六的23:59:59为最后一天;
	//我国用户习惯定义一周从周一的0时开始,对应数值2,周日的23:59:59为最后一天;
	boolean isEnd = false;
	int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
	if (1 == dayOfWeek) {
		tempDate = parseDate(getStrDateYyyyMMdd(calendar.getTime()) + " 23:59:59");
	} else {
		calendar.add(Calendar.DAY_OF_WEEK,(7 - dayOfWeek + 1));
		tempDate = parseDate(getStrDateYyyyMMdd(calendar.getTime()) + " 23:59:59");
	}		
	if (tempDate.before(endDate)) {
		isEnd = false;
		dateVo.setEndDate(tempDate);
		calendar.setTime(tempDate);
	} else {
		isEnd = true;
		dateVo.setEndDate(endDate);
	}
	int tempDays = Integer.valueOf(getDaysOfTwoDate(dateVo.getStartDate(),dateVo.getEndDate()) + "") + 1;
	dateVo.setDayNumber(tempDays);
	weekDatas.add(dateVo);
	//第二个以及之后的周	
	if (isEnd){
		return weekDatas;
	}
	int tempDayOfWeek = 0;
	int tempSn = 0;
	int sn = 1;
	while(true){
		SnDateVo xDateVo = new SnDateVo();
		tempSn = startWeek + sn;
		xDateVo.setDateSn(tempSn); 
		xDateVo.setDateSnName(weekSn.replace("X",tempSn+"");
		calendar.add(Calendar.SECOND, 1); //时间秒数加一  
		xDateVo.setStartDate(calendar.getTime());
		tempDayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
		calendar.add(Calendar.DAY_OF_WEEK,(7 - tempDayOfWeek + 1));
		tempDate = parseDate(getStrDateYyyyMMdd(calendar.getTime()) + " 23:59:59");
		if (tempDate.before(endDate)) {
			sn = sn + 1;
			xDateVo.setEndDate(tempDate);
			tempDays = Integer.valueOf(getDaysOfTwoDate(xDateVo.getStartDate(),xDateVo.getEndDate()) + "") + 1;
			xDateVo.setDayNumber(tempDays);
			weekDatas.add(xDateVo);
			calendar.setTime(tempDate); //本次最后的日期设置到日期对象中
		} else {
			xDateVo.setEndDate(endDate);
			tempDays = Integer.valueOf(getDaysOfTwoDate(xDateVo.getStartDate(),xDateVo.getEndDate()) + "") + 1;
			xDateVo.setDayNumber(tempDays);
			weekDatas.add(xDateVo);
			break;
		}
	}
	return weekDatas;
}

二,后记,

基本我们常用到的,当然还有其他用到的方法,后续有空再补充... 欢迎拍砖讨论...

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章