java实现的日期时间转换工具类完整示例
本文实例讲述了java实现的日期时间转换工具类。分享给大家供大家参考,具体如下:
最基础的东西,总结一下,下次用的时候就方便一些了。废话不多说,直接贴代码:
packagecom.incar.base.util;
importcom.incar.base.exception.BaseRuntimeException;
importjava.text.DateFormat;
importjava.text.ParseException;
importjava.text.SimpleDateFormat;
importjava.time.*;
importjava.time.temporal.ChronoField;
importjava.time.temporal.ChronoUnit;
importjava.time.temporal.WeekFields;
importjava.util.*;
/**
*CreatedbyAdministratoron2017/4/11.
*/
publicclassDateUtil{
publicfinalstaticStringDATE_FORMAT_DAY="yyyy-MM-dd";
publicfinalstaticStringDATE_FORMAT_SECOND="yyyy-MM-ddHH:mm:ss";
privatefinalstaticint[]DATE_UNIT_ARR=newint[]{Calendar.MILLISECOND,Calendar.SECOND,Calendar.MINUTE,Calendar.HOUR_OF_DAY,
Calendar.DATE,Calendar.MONTH,Calendar.YEAR};
publicstaticCalendarcalendar=null;
publicstaticDateFormatdateFormat=null;
publicstaticDatedate=null;
/**
*将日期转为字符串
*@paramdate
*@paramformat
*@return
*/
publicstaticStringdateToString(Datedate,Stringformat){
if(date==null){
returnnull;
}
returnnewSimpleDateFormat(format).format(date);
}
/**
*将日期转换为字符串(转换的时间按照当前登录用户的时区)
*
*@paramdate
*@paramformat
*@paramtimeZone
*@return
*/
publicstaticStringdateToString(Datedate,Stringformat,StringtimeZone){
if(date==null){
returnnull;
}
//1、格式化日期
returngetTimeZoneSimpleDateFormat(format,timeZone).format(date);
}
/**
*获取当前登录用户的日期格式化对象
*
*@paramtimeZone
*@paramformat
*@return
*/
privatestaticSimpleDateFormatgetTimeZoneSimpleDateFormat(Stringformat,StringtimeZone){
//1、获取对应时区的格式化器
SimpleDateFormatsimpleDateFormat=newSimpleDateFormat(format);
simpleDateFormat.setTimeZone(TimeZone.getTimeZone(timeZone));
returnsimpleDateFormat;
}
/**
*将字符串转为日期(转换的时间按照当前登录用户的时区)
*@paramdateStr
*@paramformat
*@return
*/
publicstaticDatestringToDate(StringdateStr,Stringformat,StringtimeZone){
if(dateStr==null||format==null){
returnnull;
}
try{
returngetTimeZoneSimpleDateFormat(format,timeZone).parse(dateStr);
}catch(ParseExceptione){
throwBaseRuntimeException.getException(e);
}
}
/**
*将字符串转为日期
*@paramdateStr
*@paramformat
*@return
*/
publicstaticDatestringToDate_CTT(StringdateStr,Stringformat){
if(dateStr==null||format==null){
returnnull;
}
try{
returngetTimeZoneSimpleDateFormat(format,"CTT").parse(dateStr);
}catch(ParseExceptione){
throwBaseRuntimeException.getException(e);
}
}
/**
*获取最近在当前日期之前的最后一个日期单位
*
*@paramdate
*@paramcalendarUnit只支持DateUtil.DATE_UNIT_ARR
*@return
*/
publicstaticDategetFloorDate(Datedate,intcalendarUnit){
if(date==null){
returnnull;
}
Calendarcalendar=Calendar.getInstance();
calendar.setTime(date);
for(inti=0;i<=DATE_UNIT_ARR.length-1;i++){
if(DATE_UNIT_ARR[i]>calendarUnit){
if(Calendar.DATE==DATE_UNIT_ARR[i]){
calendar.set(DATE_UNIT_ARR[i],1);
}else{
calendar.set(DATE_UNIT_ARR[i],0);
}
}
if(DATE_UNIT_ARR[i]==calendarUnit){
break;
}
}
returncalendar.getTime();
}
/**
*获取最近在当前日期之后的第一个日期单位
*
*@paramdate
*@paramcalendarUnit只支持DateUtil.DATE_UNIT_ARR
*@return
*/
publicstaticDategetCeilDate(Datedate,intcalendarUnit){
if(date==null){
returnnull;
}
Calendarcalendar=Calendar.getInstance();
calendar.setTime(date);
for(inti=0;i<=DATE_UNIT_ARR.length-1;i++){
if(DATE_UNIT_ARR[i]>calendarUnit){
if(Calendar.DATE==DATE_UNIT_ARR[i]){
calendar.set(DATE_UNIT_ARR[i],1);
}else{
calendar.set(DATE_UNIT_ARR[i],0);
}
}
if(DATE_UNIT_ARR[i]==calendarUnit){
calendar.add(DATE_UNIT_ARR[i],1);
break;
}
}
returncalendar.getTime();
}
/**
*将开始时间、结束时间根据日期单位划分成时间段
*
*
*@paramstartDate
*@paramendDate
*@paramcalendarUnitCalendar.MONTH,Calendar.DATE
*@paramdateNum指定的单位日期数量
*@return每一个数组第一个为开始时间,第二个为结束时间;第一个元素结束时间总是等于第二元素开始时间
*/
publicstaticListsplitDate(DatestartDate,DateendDate,intcalendarUnit,intdateNum){
ListreturnList=newArrayList<>();
if(startDate.getTime()>endDate.getTime()){
returnnull;
}
Calendarc1=Calendar.getInstance();
Calendarc2=Calendar.getInstance();
c1.setTime(startDate);
c2.setTime(endDate);
CalendarcurC1=Calendar.getInstance();
CalendarcurC2=null;
curC1.setTime(startDate);
while(curC2==null||curC2.before(c2)){
if(curC2==null){
curC2=Calendar.getInstance();
curC2.setTime(startDate);
curC2.add(calendarUnit,dateNum);
}else{
curC1.add(calendarUnit,dateNum);
curC2.add(calendarUnit,dateNum);
}
returnList.add(newDate[]{curC1.getTime(),curC2.getTime()});
}
//设置最后一个区间的截至日期为endDate
returnList.get(returnList.size()-1)[1]=endDate;
returnreturnList;
}
/**
*获取开始时间结束时间按照日期单位形成多个日期区间
*分割出来的时间区间以
*第一个区间开始时间为传入开始时间
*最后一个区间结束时间为传入结束时间
*@paramstartDate
*@paramendDate
*@paramunit1:代表按日;2:代表按周;3:代表按月
*@return
*/
publicstaticListrangeDate(DatestartDate,DateendDate,intunit){
ListreturnList=newArrayList<>();
LocalDateTimeldt1=LocalDateTime.ofInstant(startDate.toInstant(),ZoneId.of("+8"));
LocalDateTimeldt2=LocalDateTime.ofInstant(endDate.toInstant(),ZoneId.of("+8"));
switch(unit){
case1:{
LocalDateTimestart=ldt1.with(ChronoField.SECOND_OF_DAY,0);
LocalDateTimeend=ldt1.with(ChronoField.SECOND_OF_DAY,ChronoUnit.DAYS.getDuration().getSeconds()-1);
while(true){
returnList.add(newDate[]{Date.from(start.toInstant(ZoneOffset.of("+8"))),Date.from(end.toInstant(ZoneOffset.of("+8")))});
if(!ldt2.isBefore(start)&&!ldt2.isAfter(end)){
break;
}else{
start=start.plusDays(1);
end=end.plusDays(1);
}
}
break;
}
case2:{
intdayOfWeek=ldt1.get(ChronoField.DAY_OF_WEEK);
LocalDateTimestart=ldt1.plusDays(1-dayOfWeek).with(ChronoField.SECOND_OF_DAY,0);
LocalDateTimeend=ldt1.plusDays(7-dayOfWeek).with(ChronoField.SECOND_OF_DAY,ChronoUnit.DAYS.getDuration().getSeconds()-1);
while(true){
returnList.add(newDate[]{Date.from(start.toInstant(ZoneOffset.of("+8"))),Date.from(end.toInstant(ZoneOffset.of("+8")))});
if(!ldt2.isBefore(start)&&!ldt2.isAfter(end)){
break;
}else{
start=start.plusWeeks(1);
end=end.plusWeeks(1);
}
}
if(returnList.size()>0){
Date[]firstEle=returnList.get(0);
Date[]lastEle=returnList.get(returnList.size()-1);
firstEle[0]=Date.from(ldt1.with(ChronoField.SECOND_OF_DAY,0).toInstant(ZoneOffset.of("+8")));
lastEle[1]=Date.from(ldt2.with(ChronoField.SECOND_OF_DAY,0).toInstant(ZoneOffset.of("+8")));
}
break;
}
case3:{
LocalDateTimetemp=ldt1;
while(true){
intdayOfMonth=temp.get(ChronoField.DAY_OF_MONTH);
intmax=temp.getMonth().maxLength();
LocalDateTimestart=temp.plusDays(1-dayOfMonth).with(ChronoField.SECOND_OF_DAY,0);
LocalDateTimeend=temp.plusDays(max-dayOfMonth).with(ChronoField.SECOND_OF_DAY,ChronoUnit.DAYS.getDuration().getSeconds()-1);
returnList.add(newDate[]{Date.from(start.toInstant(ZoneOffset.of("+8"))),Date.from(end.toInstant(ZoneOffset.of("+8")))});
if(!ldt2.isBefore(start)&&!ldt2.isAfter(end)){
break;
}else{
temp=temp.plusMonths(1);
}
}
if(returnList.size()>0){
Date[]firstEle=returnList.get(0);
Date[]lastEle=returnList.get(returnList.size()-1);
firstEle[0]=Date.from(ldt1.with(ChronoField.SECOND_OF_DAY,0).toInstant(ZoneOffset.of("+8")));
lastEle[1]=Date.from(ldt2.with(ChronoField.SECOND_OF_DAY,0).toInstant(ZoneOffset.of("+8")));
}
break;
}
}
returnreturnList;
}
/**
*计算两个时间相差多少日期单位(不足一个日期单位的的按一个日期单位算)
*
*@paramd1开始时间
*@paramd2结束时间
*@return相差日期单位数
*/
publicstaticintgetDiff(Dated1,Dated2,intcalendarUnit){
doublediff;
switch(calendarUnit){
caseCalendar.DATE:{
diff=1000*60*60*24;
break;
}
caseCalendar.HOUR_OF_DAY:{
diff=1000*60*60;
break;
}
caseCalendar.MINUTE:{
diff=1000*60;
break;
}
caseCalendar.SECOND:{
diff=1000;
break;
}
default:{
throwBaseRuntimeException.getException("[DateUtil.getDiff],CalendarUnitNotSupport!");
}
}
Longbegin=d1.getTime();
Longend=d2.getTime();
Doubleres=(end-begin)/diff;
return(int)Math.ceil(res);
}
/**
*会改变参数值
*格式化日期参数开始日期和结束日期
*格式规则为:
*开始日期去掉时分秒
*结束日期设置为当天23:59:59
*
*@paramstartDate
*@paramendDate
*/
publicstaticvoidformatDateParam(DatestartDate,DateendDate){
if(startDate!=null){
startDate.setTime(getFloorDate(startDate,Calendar.DATE).getTime());
}
if(endDate!=null){
DatetempDate=getCeilDate(endDate,Calendar.DATE);
CalendarendC=Calendar.getInstance();
endC.setTime(tempDate);
endC.add(Calendar.SECOND,-1);
endDate.setTime(endC.getTimeInMillis());
}
}
/**
*获取一个日期的数字表示形式
*例如:
*2018-3-1215:13:12888表示成20180312151312888
*
*@paramdate
*@paramcalendarUnit最小的日期单位
*@return
*/
publicstaticLonggetDateNum(Datedate,intcalendarUnit){
if(date==null){
returnnull;
}
StringBuffersb=newStringBuffer();
Calendarc=Calendar.getInstance();
c.setTime(date);
if(calendarUnit>=Calendar.YEAR){
sb.append(c.get(Calendar.YEAR));
}
if(calendarUnit>=Calendar.MONTH){
sb.append(FormatUtil.formatToString(c.get(Calendar.MONTH)+1,"00"));
}
if(calendarUnit>=Calendar.DATE){
sb.append(FormatUtil.formatToString(c.get(Calendar.DATE),"00"));
}
if(calendarUnit>=Calendar.HOUR_OF_DAY){
sb.append(FormatUtil.formatToString(c.get(Calendar.HOUR_OF_DAY),"00"));
}
if(calendarUnit>=Calendar.MINUTE){
sb.append(FormatUtil.formatToString(c.get(Calendar.MINUTE),"00"));
}
if(calendarUnit>=Calendar.SECOND){
sb.append(FormatUtil.formatToString(c.get(Calendar.SECOND),"00"));
}
if(calendarUnit>=Calendar.MILLISECOND){
sb.append(FormatUtil.formatToString(c.get(Calendar.MILLISECOND),"000"));
}
returnLong.parseLong(sb.toString());
}
/**
*判断两个日期是否相等
*
*@paramd1
*@paramd2
*@paramcalendarUnit对比的最小日期单位
*@return
*/
publicstaticbooleanisEqual(Dated1,Dated2,intcalendarUnit){
Calendarc1=Calendar.getInstance();
Calendarc2=Calendar.getInstance();
c1.setTime(d1);
c2.setTime(d2);
for(inti=DATE_UNIT_ARR.length-1;i>=0;i--){
if(calendarUnit>=DATE_UNIT_ARR[i]){
intv1=c1.get(DATE_UNIT_ARR[i]);
intv2=c2.get(DATE_UNIT_ARR[i]);
if(v1!=v2){
returnfalse;
}
}else{
break;
}
}
returntrue;
}
/**
*获取当天初始时间
*
*@paramdate时间
*@return初始时间(yyyy-MM-dd00:00:00)
*/
publicstaticDategetInitialTime(Datedate){
DateFormatdateFormat=newSimpleDateFormat("yyyy-MM-dd00:00:00");
StringdateStr=dateFormat.format(date);
try{
returndateFormat.parse(dateStr);
}catch(ParseExceptione){
e.printStackTrace();
}
returnnull;
}
/**
*获取当天最后时间
*
*@paramdate时间
*@return最后时间(yyyy-MM-dd23:59:59)
*/
publicstaticDategetTerminalTime(Datedate){
DateFormatdateFormat=newSimpleDateFormat("yyyy-MM-dd");
StringdateStr=dateFormat.format(date);
dateStr=dateStr+"23:59:59";
dateFormat=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");
try{
returndateFormat.parse(dateStr);
}catch(ParseExceptione){
e.printStackTrace();
}
returnnull;
}
publicstaticStringdate2Str(Datedate){
DateFormatdateFormat=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");
returndateFormat.format(date);
}
/**
*计算两个时间间隔多少秒
*
*@paramstartDate
*@paramendDate
*@return
*/
publicstaticLongintervalTime(DatestartDate,DateendDate){
longa=endDate.getTime();
longb=startDate.getTime();
Longc=((a-b)/1000);
returnc;
}
/**
*检测一个日期是否在小时之内,支持跨天的小时
*
*@paramtime
*@paramstartDate
*@paramendDate
*@return
*/
publicstaticbooleancheckDateIn(Datetime,DatestartDate,DateendDate){
if(startDate==null||endDate==null||time==null){
returntrue;
}
returntime.before(endDate)&&time.after(startDate);
}
/**
*检测一个日期是否在时分秒之内,支持跨天的小时
*
*@paramtime
*@paramstartHms
*@paramendHms
*@return
*/
publicstaticbooleancheckHmsIn(Datetime,StringstartHms,StringendHms){
if(startHms==null||endHms==null||time==null){
returntrue;
}
LocalTimestartTime=LocalTime.of(
Integer.valueOf(startHms.substring(0,2)),
Integer.valueOf(startHms.substring(2,4)),
Integer.valueOf(startHms.substring(4,6))
);
LocalTimeendTime=LocalTime.of(
Integer.valueOf(endHms.substring(0,2)),
Integer.valueOf(endHms.substring(2,4)),
Integer.valueOf(endHms.substring(4,6))
);
LocalTimecurTime=LocalDateTime.ofInstant(time.toInstant(),ZoneId.of("+8")).toLocalTime();
if(endTime.isAfter(startTime)){
returnstartTime.isBefore(curTime)&&endTime.isAfter(curTime);
}else{
return(startTime.isBefore(curTime)&&LocalTime.MAX.isAfter(curTime))||(LocalTime.MIN.isBefore(curTime)&&endTime.isAfter(curTime));
}
}
/**
*功能描述:格式化日期
*
*@paramdateStr字符型日期:YYYY/MM/DD格式
*@returnDate日期
*/
publicstaticDateparseDate(StringdateStr){
returnparseDate(dateStr,"yyyy-MM-dd");
}
/**
*功能描述:格式化日期
*
*@paramdateStr字符型日期
*@paramformat格式
*@returnDate日期
*/
publicstaticDateparseDate(StringdateStr,Stringformat){
try{
dateFormat=newSimpleDateFormat(format);
Stringdt=dateStr.replaceAll("-","/");
if((!dt.equals(""))&&(dt.length()
PS:这里再为大家推荐几款关于日期与时间计算的在线工具供大家参考使用:
在线日期/天数计算器:
http://tools.jb51.net/jisuanqi/date_jisuanqi
在线万年历日历:
http://tools.jb51.net/bianmin/wannianli
在线阴历/阳历转换工具:
http://tools.jb51.net/bianmin/yinli2yangli
Unix时间戳(timestamp)转换工具:
http://tools.jb51.net/code/unixtime
更多关于java相关内容感兴趣的读者可查看本站专题:《java日期与时间操作技巧汇总》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。