Java 时间 年月日及其持续天数 用Date!!!

软构lab3

知道开始和结束日期的年月日,求持续天数

  • getTimeInMillis()将其转化成long,表示从格林威治标准时间 1970 年 1 月 1 日的
    00:00:00.000到Calendar对象表示的时间之间的毫秒数
import java.util.Calendar;

public class Try {
	public static void main(String[] args) {
		Calendar startdate = Calendar.getInstance();
		Calendar enddate = Calendar.getInstance();
		
		//设置时间
		startdate.set(2021,6,30);
		enddate.set(2021,7,2);
		
		//getTimeInMills()函数
		long dura = enddate.getTimeInMillis() - startdate.getTimeInMillis();
		
		//输出检查
		System.out.println(startdate.get(Calendar.YEAR)+"-"+startdate.get(Calendar.MONTH)+"-"+startdate.get(Calendar.DATE));
		System.out.println(enddate.get(Calendar.YEAR)+"-"+enddate.get(Calendar.MONTH)+"-"+enddate.get(Calendar.DATE));
		
		//得到毫秒数
		System.out.println(dura);
		
		//得到天数
		System.out.println(dura/1000/60/60/24);
	}

}

以上方法十分离谱,快跑!!!

2021-6-1到2021-6-5得到的时间是4
但是!2021-6-30到2021-7-1得到的时间却是1

如果涉及到月转换,就别用这个方法

看了一番突然发现了问题所在:
java里的Calendar不检查月份天数,它默认每个月都是31天。

	public static String nyr(Calendar a) {
		String mystr = a.get(Calendar.YEAR)+"-"+a.get(Calendar.MONTH)+"-"+a.get(Calendar.DATE);
		return mystr;
		
	}
	
	public static void main(String[] args) {
		
		Calendar a = Calendar.getInstance();
		a.set(2021,2,28);
		
		System.out.println(nyr(a));
		a.add(Calendar.DATE, 1);
		System.out.println(nyr(a));
		a.add(Calendar.DATE, 1);
		System.out.println(nyr(a));
		a.add(Calendar.DATE, 1);
		System.out.println(nyr(a));
		a.add(Calendar.DATE, 1);
		System.out.println(nyr(a));

	}

输出如下:
在这里插入图片描述
???谁家2月有30号啊!!!!

再见Calendar,我用Date去了

新方法如下:

package test;

//注意:引进的包是sql里的
import java.sql.Date;
import java.util.Calendar;

public class Try {
	//给日期加n天
	public static Date add_days(Date a,long day) {
		Calendar temp =  Calendar.getInstance();
		temp.setTime(a);
		temp.set(Calendar.DATE, temp.get(Calendar.DATE)+(int)day);
		Date mydate = new Date(temp.get(Calendar.YEAR)-1900,temp.get(Calendar.MONTH),temp.get(Calendar.DATE));
		return mydate;
	}
	
	//计算两个日期之间的持续天数
	public static long getDuration(Date early,Date late) {
		//不必考虑日期的先后顺序,加个绝对值
		long myDura = Math.abs(early.getTime() - late.getTime())/(1000*60*60*24);
		return myDura;
	}
	
	public static void main(String[] args) {
		
		//奇妙的赋值方式
		//年份-1900,月份-1,日正常
		Date a = new Date(2021-1900,2-1,28);
		System.out.println( a.toString());
		
		System.out.println("---------测试:加方法是否跨月份----------");
		
		//注意:Date是mutable的
		a = add_days(a, 1);
		System.out.println( a.toString());
		
		a = add_days(a, 1);
		System.out.println( a.toString());
		
		a = add_days(a, 1);
		System.out.println( a.toString());
		
		
		System.out.println("---------测试:两个日期之间的持续天数----------");
		
		Date b = new Date(2021-1900,6-1,1);
		Date c = new Date(2021-1900,6-1,5);
		Date d = new Date(2021-1900,7-1,1);
		
		System.out.println("2021-6-1 到 2021-6-5 间隔 "+getDuration(b, c)+" 天");
		System.out.println("2021-6-1 到 2021-7-1 间隔 "+getDuration(d, b)+" 天");

}

在这里插入图片描述
nice

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值