-
java计算日期相差天数的4种简单方法举例
最近在工作中遇见一个小需求,要求计算两个日期之间相差几天,下面这篇文章主要给大家介绍了关于java计算日期相差天数的4种简单方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
方法1:long值相减(推荐)
public static void main(String[] args) {
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
Date startDate = dateFormat.parse("2024-03-01 10:00:00");//开始时间
Date endDate = dateFormat.parse("2024-03-02 14:00:00");//结束时间
long msNum = endDate.getTime()-startDate.getTime();//时间戳相差的毫秒数
long dayNum = msNum/(24*60*60*1000)//除以一天的毫秒数,得到相差天数
System.out.println("相差天数为:"+ dayNum);
} catch (ParseException e) {
e.printStackTrace();
}
}
方法2:
public static void main(String[] args) {
DateFormat dft = new SimpleDateFormat("yyyy-MM-dd");
try {
Date star = dft.parse("2020-02-03");//开始时间
Date endDay=dft.parse("2025-03-02");//结束时间
Date nextDay=star;
int i=0;
while(nextDay.before(endDay)){//当明天不在结束时间之前是终止循环
Calendar cld = Calendar.getInstance();
cld.setTime(star);
cld.add(Calendar.DATE, 1);
star = cld.getTime();
//获得下一天日期字符串
nextDay = star;
i++;
}
System.out.println("相差天数为:"+i);
} catch (ParseException e) {
e.printStackTrace();
}
}
方法3:
public static void main(String[] args) {
String star="2020-02-03";
String end="2025-03-02";
String[] star1=star.split("-");
String[] end1=end.split("-");
int days=0;
if(Integer.parseInt(star1[0])<Integer.parseInt(end1[0])){
for(int i=Integer.parseInt(star1[0]);i<Integer.parseInt(end1[0]);i++){
//计算是否是瑞年
if(i%4==0&&i%100!=0||i%400==0){
days+=366;
}else{
days+=365;
}
}
}
//得到开始那一年已过去的日期
int starday=days(star1[0],star1[1],star1[2]);
//得到结束那一年已过去的日期
int endday=days(end1[0],end1[1],end1[2]);
//减去开始那一年已过去的日期,加上结束那一年已过去的日期
days=days-starday+endday;
System.out.println("相差的天数:"+days);
}
public static int days(String year,String month,String day){
int days=0;
int nowyear=Integer.parseInt(year);
int[] monthday={0,31,28,31,30,31,30,31,31,30,31,30,31};
int[] monthday1={0,31,29,31,30,31,30,31,31,30,31,30,31};
boolean flag=true;
if(nowyear%4==0&&nowyear%100!=0||nowyear%400==0){
}else{
flag=false;
}
for(int i=0;i<Integer.parseInt(month);i++){
if(flag){
days+=monthday1[i];
}else{
days+=monthday[i];
}
}
days+=Integer.parseInt(day);
return days;
}
方法4:
int y;
int m;
int d;
public test2(int y,int m,int d ){
this.y=y;
this.m=m;
this.d=d;
}
public int sum(test2 d){
int day=0;
int[] x={0,31,28,31,30,31,30,31,31,30,31,30,31};
for(int i=1;i<d.y;i++){
if(i%4==0&& i%100!=0 || i%400==0){
day+=366;
}else{
day+=365;
}
}
if(d.y%4==0&& d.y%100!=0 || d.y%400==0){
x[2]=29;
}
for(int i=1;i<d.m;i++){
day+=x[i];
}
day+=d.d;
System.out.println(day);
return day;
}
public int DiffDays(test2 d){//计算两个日期之间的相距天数的成员方法
int s1=sum(this);
int s2=sum(d);
if(s1>s2){
return s1-s2;
}else{
return s2-s1;
}
}
public static void main(String args[]){
int a,b,c;
test2 d1,d2;
try{
d1=new test2(2020,02,03);
d2=new test2(2025,03,02);
System.out.println("相差的天数:"+d1.DiffDays(d2));
}catch(Exception e){
System.out.println("error");
}
}
附:计算两个日期相差天数(除去双休日)
首先可以将问题简化一下,可以知道,不论开始、结束日期,只要经过7天,必定就有两天是周末。因此问题可以简化为,一周内的双休日天数+周数*2.
public int checkWeekendDay(int startDate, int endDate, int days){
int weekEndCount = 0;
if (days<1){
if (startDate==6 || startDate==0){
weekEndCount+=1;
}
} else {
weekEndCount+=(days/7)*2;
weekEndCount+=calculateWeekendDays(startDate,endDate);
}
return weekEndCount;
}
public int calculateWeekendDays(int startDate, int endDate){
int weekendCount=0;
if (startDate==0&&endDate==6) {
weekendCount += 2;
}else if (startDate<endDate&&endDate==6){
weekendCount+=1;
}else if (startDate<endDate&&startDate==0){
weekendCount+=1;
}else if (startDate>endDate){
weekendCount+=2;
}
if (startDate==endDate){
if (startDate==6||endDate==0){
weekendCount+=1;
}
}
return weekendCount;
}
总结
到此这篇关于java计算日期相差天数的4种简单方法举例的文章就介绍到这了,更多相关java计算日期相差天数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持
原文链接:https://blog.csdn.net/u011149152/article/details/136491872
最新更新
Java代码审计之URL重定向的问题解决
java计算日期相差天数的4种简单方法举例
Java参数校验详解之使用@Valid注解和自定义
Java创建对象的六种常用方式总结
Spring Boot使用AOP在指定方法执行完后执行
如何读取MDF(Measurement Data Format)文件中
pythonv如何解析mdf或mf4文件之asammdf用法
SpringBoot实现调用自定义的应用程序((最新
详解如何使用XML配置来定义和管理Spring
SpringBoot中使用MQTT实现消息的订阅和发布
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
uniapp/H5 获取手机桌面壁纸 (静态壁纸)
[前端] DNS解析与优化
为什么在js中需要添加addEventListener()?
JS模块化系统
js通过Object.defineProperty() 定义和控制对象
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比