日期与时间

时间的表示

  • 在 Java 里,时间处理相关的类型:

long 时间值

java.util.Date 时间对象

java.util.Calendar 时间操作工具类

java.text.SimpleDateFormat 格式化工具类

另外,自从Java1.8还引入了 java.time.* 包。用long和Date均可以表示一个时间值。

  • 一个long型整数可以表示当前时间,单位:毫秒 。表示:自1970-1-1  00:00:00 以来的时间差值
		long time=System.currentTimeMillis();
		System.out.println(time);

另外,java.util.Date 类也可以表示一个时间值

		Date date=new Date();
		System.out.println(date.getTime());

注意:是 java.util.Date, 不是 java.sql.Date

  • 其实,可以把 Date 视为 long 的包装类,可以类比 int 与 Integer的关系
public class Date     
{           
    private long timeValue;
} 
  • long 与 Date 可以轻松转换

long -> Date    

Date date = new Date(timeValue);
date.setTime(timeValue);
  • Date -> long    
long timeValue = date.getTime();

时间的格式化

默认地,可以直接调用 Date.toString() 显示

Date now = new Date();    
String  dateStr = now.toString(); 

但默认的显示往往不是我们想要的,形如:Sat Mar 13 16:25:24 CST 2021。借助于 SimpleDateFormat 类,可以实现日期的格式化操作。

		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		
		Date date=new Date();
		String timeStr=sdf.format(date);
		System.out.println(timeStr);

将一个日期时间字符串,解析为一个Date对象

		SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
		
		String timeStr="2021/3/13 16:29:42";
		try
		{
			Date date=sdf.parse(timeStr);
			System.out.println(date.toString());
		} catch (ParseException e)
		{
			e.printStackTrace();
		}

历法计算

java.util.Calendar 类,提供历法相关的计算。它是一个抽象类,Calender 对象必须通过其静态方法创建

Calendar cal = Calendar.getInstance();

默认地,cal 为当前时间。不能 new Calendar () ,因为它的构造方法不是 public 的。

  • 获取年月日时分秒的值
		Calendar cal=Calendar.getInstance();
		// YEAR
		int year = cal.get(Calendar.YEAR);
		// MONTH: 从0开始计数, 范围 0,1,2,..., 11
		int month = cal.get(Calendar.MONTH);
		// DAY_OF_MONTH: 本月第几天, 范围 1,2,3,...,31
		int dayOfMonth = cal.get(Calendar.DAY_OF_MONTH);
		// HOUR_OF_DAY : 小时,24小时制, 范围 0,1,2,...,23
		int hour = cal.get(Calendar.HOUR_OF_DAY);
		// MINUTE : 分钟 , 范围 0,1,2,...,59
		int minute = cal.get(Calendar.MINUTE);
		// SECOND : 秒值 , 范围 0,1,2,...,59
		int second = cal.get(Calendar.SECOND);
		// DAY_OF_WEEK: 本周第几天, 范围1,2,...,7 ,星期日为1
		int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
		// DAY_OF_YEAR: 当年第几天, 范围1,2,...,366 
		int dayOfYear = cal.get(Calendar.DAY_OF_YEAR);
  • 设置年月日时分秒
		Calendar cal = Calendar.getInstance();
		// 设置年月日 '2021-6-7' ,注意月份从0计数
		cal.set(2020, 5, 7);
		// 设置年月日时分秒 '2021-6-7 20:15:48'
		cal.set(2020, 5, 7, 20, 15, 48);

		// 只设置年
		cal.set(Calendar.YEAR, 2021);
		// 只设置月,注意月份从0计数
		cal.set(Calendar.MONTH, 5);
		// 只设置日
		cal.set(Calendar.DAY_OF_MONTH, 7);
		// 只设置时
		cal.set(Calendar.HOUR_OF_DAY, 20);
		// 只设置分
		cal.set(Calendar.MINUTE, 15);
		// 只设置秒
		cal.set(Calendar.SECOND, 48);
  • 往前或往后推算时间

其中,add一个正值表示向后推,add一个负值表示向前推。这里演示的是天数加减,同样也可以执行月分、年份等的推算。

		Calendar cal = Calendar.getInstance();
		// 前天
		cal.add(Calendar.DAY_OF_MONTH, -2);		
		// 30天之后
		cal.add(Calendar.DAY_OF_MONTH, 30);
  • Calendar与时间值 long , Date 的转换
		Calendar cal = Calendar.getInstance();
		// Calendar -> Date, long
		Date date = cal.getTime();
		long timeValue = cal.getTimeInMillis();	
	
		// Date,long -> Calendar
		cal.setTime(date);
		cal.setTimeInMillis(timeValue);
  • 计算两个日期之间的差值

可以先换算为毫秒值,再做计算

		SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd");
		
		Calendar a = Calendar.getInstance();
		a.set(2021,2,1);//2021/03/01	
		Calendar b = Calendar.getInstance();
		b.set(2021,2,19);//2021/03/19	

		long timeValue = b.getTimeInMillis() - a.getTimeInMillis();
		long days = timeValue / (1000 * 3600 * 24);
		System.out.println(sdf.format(a.getTime())+"与"+sdf.format(b.getTime())+"相隔天数:"+days);
  • 小例子

计算2021年的父亲节,父亲节是每年6月的第3个星期日,那么计算一下 2021 年的父亲节是几号。

		Calendar cal = Calendar.getInstance();
		cal.set(2021, 5, 1);//从2021年6月1日开始推算
		
		int numWeek=0;
		for(int i=0;i<31;i++)
		{
			int dayOfWeek=cal.get(Calendar.DAY_OF_WEEK);
			if(dayOfWeek==Calendar.SUNDAY)// SUNDAY就是星期日,即数字1
			{
				numWeek++;
				if(numWeek==3)// 第3个星期日
				{
					System.out.println("2021年父亲节:2021/6/"+(i+1));
					break;
				}
			}
			cal.add(Calendar.DAY_OF_MONTH, 1);
		}
  • 注意:月份从0开始,一月为0 。星期从1开始,星期日为1 。为了避免混乱,可以用常量名字
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值