时间的表示
- 在 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 。为了避免混乱,可以用常量名字