1.时间类的介绍
- 时间类如上,我们常用的是日历类Calendar,java.util.Date类,日期格式化SimpleDateFormat类。
- java.util.Date类,用于获取系统当前时间,返回的是一个距离1970年1月1日 00:00:00的毫秒数
- DateFormat类继承自Format类,他们都是抽象类,是一个日期的格式化类,用来格式化日期,不过通常使用SimpleDateFormat类来格式化日期
2. Date类----获取系统当前时间
在开发过程中,通常很多人都习惯使用new Date()来获取当前时间。new Date()所做的事情其实就是调用了System.currentTimeMillis()。如果仅仅是需要毫秒数,那么完全可以使用System.currentTimeMillis()去代替new Date(),效率上会高一点。如果需要在同一个方法里面多次使用new Date(),通常性能就是这样一点一点地消耗掉的。
package com.zhaoyunlong.date;
import java.util.Date;
public class DateTest1 {
public static void main(String[] args) {
//获得系统的时间,单位为毫秒
long currentTimeMillis = System.currentTimeMillis();
System.out.println(currentTimeMillis);
//获得系统的时间,单位为毫秒
Date date = new Date();
System.out.println(date.getTime());
}
}
运行结果:
3.DateFormat
这是一个日期的格式化类,用来格式化日期的,它是一个抽象类,继承了Format类。
3.1 DateFormat的实例化
DateFormat是一个抽象类,按照以住的思路,直接使用其子类实例化即可。但是DateFormat 类本身的内部提供了可以直接为其实例化的操作。
//得到日期的DateFormat对象:
public static final DateFormat getDateInstance();
//得到日期时间的DateFormat对象:
public static final DateFormat getDateTimeInstance();
//使用DateFormat类格式化Date类日期
public final String format(Date date)
3.2 日期格式
import java.text.DateFormat ;
import java.util.Date ;
public class DateDemo03{
public static void main(String args[]){
DateFormat df1 = null ; // 声明一个DateFormat
DateFormat df2 = null ; // 声明一个DateFormat
df1 = DateFormat.getDateInstance() ; // 得到日期的DateFormat对象
df2 = DateFormat.getDateTimeInstance() ; // 得到日期时间的DateFormat对象
System.out.println("DATE:" + df1.format(new Date())) ; // 按照日期格式化
System.out.println("DATETIME:" + df2.format(new Date())) ; // 按照日期时间格式化
}
}
运行结果如下:
4. SimpleDateFormat类
SimpleDateFormat函数的继承关系:
java.lang.Object
|
+—-java.text.Format
|
+—-java.text.DateFormat
|
+—-java.text.SimpleDateFormat
4.1 日期模板
根据模板的格式来转化日期
4.2 SimpleDateFormat类使用
在构造对象时要传入日期格式模板
//构造方法:
public SimpleDateFormat(String pattern)
//转换:
public Date parse(String source)throws ParseException //-->此时取得的是全部时间数。
//格式化:
public final String Format(Date date) //-->将时间重新格式化成字符串显示。
4.3 案例
4.3.1 把Date的时间对象转化成指定的日期格式
package com.zhaoyunlong.date;
import java.text.SimpleDateFormat;
import java.util.Date;
public class FormatDateTime {
public static void main(String[] args) {
SimpleDateFormat myFmt = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
SimpleDateFormat myFmt1 = new SimpleDateFormat("yy/MM/dd HH:mm");
SimpleDateFormat myFmt2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//等价于now.toLocaleString()
SimpleDateFormat myFmt3 = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒 E ");
SimpleDateFormat myFmt4 = new SimpleDateFormat(
"一年中的第 D 天 一年中第w个星期 一月中第W个星期 在一天中k时 z时区");
Date now = new Date();
System.out.println(now.toString()); // Fri Jul 02 21:59:17 CST 202
System.out.println(myFmt.format(now)); // 2021年07月02日 21时59分17秒
System.out.println(myFmt1.format(now)); // 21/07/02 21:59
System.out.println(myFmt2.format(now)); // 2021-07-02 21:59:17
System.out.println(myFmt3.format(now)); // 2021年07月02日 21时59分17秒 周五
System.out.println(myFmt4.format(now)); // 一年中的第 183 天 一年中第27个星期 一月中第1个星期 在一天中21时 CST时区
}
}
运行结果如下:
4.3.2 把给定的字符串中的日期提取为Date
这样做,通常是一个日期字符串,但不是想要的格式,可以先转化为Date,再转化为其它格式。
package com.zhaoyunlong.date;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateDemo2 {
public static void main(String args[]) {
String strDate = "2008-10-19 10:11:30.345";
// 准备第一个模板,从字符串中提取出日期数字
String pat1 = "yyyy-MM-dd HH:mm:ss.SSS";
// 准备第二个模板,将提取后的日期数字变为指定的格式
String pat2 = "yyyy年MM月dd日 HH时mm分ss秒SSS毫秒";
SimpleDateFormat sdf1 = new SimpleDateFormat(pat1); // 实例化模板对象
SimpleDateFormat sdf2 = new SimpleDateFormat(pat2); // 实例化模板对象
Date d = null;
try {
d = sdf1.parse(strDate); // 将给定的字符串中的日期提取出来
System.out.println(d);
} catch (Exception e) { // 如果提供的字符串格式有错误,则进行异常处理
e.printStackTrace(); // 打印异常信息
}
System.out.println(sdf2.format(d)); // 将日期变为新的格式
}
}
说明:
-
DateFormat 可以直接使用,但其本身是一个抽象类,它内部提供一个实例化对象的方法,可以根据Locate指定的区域得到对应的日期时间格式
-
SimpleDateFormat 类是DateFormat 类的子类,一般情况下, DateFormat 类很少会直接使用,而都使用SimpleDateFormat 类完成。
5. Calendar类
1.Calendar类是一个抽象类,可以为在某一特定时刻和一组之间的转换的方法calendar fields如YEAR , MONTH , DAY_OF_MONTH , HOUR ,等等,以及用于操纵该日历字段,如获取的日期下个星期。 时间上的瞬间可以用毫秒值表示,该值是从1970年1月1日00:00 00:00.000 GMT(Gregorian)的Epoch的偏移量。
2. 该类还提供了用于在包外部实现具体日历系统的其他字段和方法。 这些字段和方法定义为protected 。
3. Calendar提供了一种类方法getInstance ,用于获取此类型的一般有用的对象。 Calendar的getInstance方法返回一个Calendar对象,其日历字段使用当前日期和时间进行初始化:
Calendar rightNow = Calendar.getInstance();
5.1 获取时间
package com.zhaoyunlong.date;
import java.util.Calendar;
public class CalendarDemo {
public static void main(String[] args) {
// 使用默认时区和语言环境获得一个日历
Calendar calendar = Calendar.getInstance();
// 赋值时年月日时分秒常用的6个值,注意月份下标从0开始,所以取月份要+1
System.out.println("calendar----" + calendar);
System.out.println("年:" + calendar.get(Calendar.YEAR));
System.out.println("月:" + (calendar.get(Calendar.MONTH) + 1));
System.out.println("日:" + calendar.get(Calendar.DAY_OF_MONTH));
System.out.println("时:" + calendar.get(Calendar.HOUR_OF_DAY));
System.out.println("分:" + calendar.get(Calendar.MINUTE));
System.out.println("秒:" + calendar.get(Calendar.SECOND));
}
}
运行结果
5.2 设置时间
月份的下标从 0 开始,设置时同样需要注意,比如我们设置为 2 月 15 日除夕当晚的倒计时的最后一秒: 2021-02-15 23:59:59
可以这样:
Calendar cal = Calendar.getInstance();
// 如果想设置为某个日期,可以一次设置年月日时分秒,由于月份下标从0开始赋值月份要-1
// cal.set(year, month, date, hourOfDay, minute, second);
cal.set(2021, 1, 15, 23, 59, 59);
或者也可以单个字段一一设置:
// 或者6个字段分别进行设置,由于月份下标从0开始赋值月份要-1
cal.set(Calendar.YEAR, 2021);
cal.set(Calendar.MONTH, Calendar.FEBRUARY);
cal.set(Calendar.DAY_OF_MONTH, 15);
cal.set(Calendar.HOUR_OF_DAY, 23);
cal.set(Calendar.MINUTE, 59);
cal.set(Calendar.SECOND, 59);
System.out.println(cal.getTime());
输出结果为:
Mon Feb 15 23:59:59 CST 2021
5.3 时间计算
add方法
- 比如在除夕当晚最后一秒,add 一秒:
Calendar cal = Calendar.getInstance();
System.out.println(cal.getTime());
cal.set(2018, 1, 15, 23, 59, 59);
cal.add(Calendar.SECOND, 1);
System.out.println(cal.getTime());
打印时间结果如下,日期会自动进入下一天:
Thu Feb 15 23:59:59 CST 2018
Fri Feb 16 00:00:00 CST 2018
- 比如 1 月 31 号的时候,月份加一,会出现怎样结果—>add 月份时,会将不存在的日期归为当月日历的最后一天
Calendar cal = Calendar.getInstance();
cal.set(2018, 1, 31, 8, 0, 0);
System.out.println(cal.getTime());
cal.add(Calendar.MONTH, 1);
System.out.println(cal.getTime());
输出 结果
Wed Jan 31 08:00:00 CST 2018
Wed Feb 28 08:00:00 CST 2018