在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;
}
二,后记,
基本我们常用到的,当然还有其他用到的方法,后续有空再补充... 欢迎拍砖讨论...