在JDK8
前,java对时间的处理使用的是java.util.Date
与java.util.Calendar
等。
首先我们先来获取一下系统时间
//通过Date实例来取得系统时间
Date date = new Date();
System.out.println(date.getTime());
//通过currentTimeMillis()取得系统时间
System.out.println(System.currentTimeMillis());
但是这两种方法,返回的是long
类型整数,代表1970年1月1日0时0分0秒0毫秒至今经过的毫秒数
而有关日期格式的处理,则使用到了java.text.DateFormat
,DateFormat
是个抽象类,其操作类是java.text.SimpleDateFormat
。
我们直接使用DateFormat
的静态方法,来对日期进行格式化
static void dateInstanceDemo(Date date){
//get日期
//\t 制表符,格式化显示数据
//%s %n 格式控制符号,%s表示以字符串格式输出,%n表示换行符
out.println("getDateInstance() demo");
out.printf("\tLONG:%s%n",getDateInstance(LONG).format(date));
out.printf("\tSHORT:%s%n",getDateInstance(SHORT).format(date));
}
通过getDateInstance()
方法,对Date实例
进行LONG
或者SHORT
的格式设置,LONG表示显示完整的日期(年月日),而SHORT显示日期缩写(yy-mm-dd)
。
有对日期进行格式化的方法,就有对时间进行格式化的方法:getTimeInseance()
与getDateInstance()
不同的是,getTimeInseance()
有三种格式,分别是LONG、MEDIUM和SHORT
。
static void timeInseanceDemo(Date date){
//get时间
out.println("getTimeInseance() demo");
out.printf("\tLONG:%s%n",getTimeInstance(LONG).format(date));
out.printf("\tMEDIUM:%s%n",getTimeInstance(MEDIUM).format(date));
out.printf("\tSHORT:%s%n",getTimeInstance(SHORT).format(date));
}
还有一个getDateTimeInstance()
方法可以将日期与时间合并显示
static void timeInstanceDemo(Date date){
//get完整的日期时间
out.println("getDateTimeInseance() demo");
out.printf("\tLONG: %s%n",getDateTimeInstance(LONG,LONG).format(date));
out.printf("\tMEDIUM: %s%n",getDateTimeInstance(SHORT,MEDIUM).format(date));
out.printf("\tSHORT: %s%n",getDateTimeInstance(SHORT,SHORT).format(date));
}
除此之外,我们也可以通过get()
方法并指定Calendar
上的字段枚举常数来获取单独的年、月、日等。
Calendar calendar = Calendar.getInstance();
/*
* 取得Calendar实例后,可以使用getTime()获取Date实例,如果想要取得年月日等
* 可以使用get()方法并指定Calendar上的字段枚举常数
*/
System.out.println(calendar.get(Calendar.YEAR));
System.out.println(calendar.get(Calendar.MONTH));
System.out.println(calendar.get(Calendar.DATE));
执行代码的时候就会发现一个问题,现在当前时间是2019年4月9日,以上代码应该会依次输出“2019”“4”和“9”,可结果不是这样。
为什么月份会少1呢?因为在java.util.Calendar
中,月份列举值的一月是从数字0开始的,所以月份的值需要特别注意:
* public final static int JANUARY = 0;
* public final static int FEBRUARY = 1;
* public final static int MARCH = 2;
* public final static int APRIL = 3;
* public final static int MAY = 4;
* public final static int JUNE = 5;
* public final static int JULY = 6;
* public final static int AUGUST = 7;
* public final static int SEPTEMBER = 8;
* public final static int OCTOBER = 9;
* public final static int NOVEMBER = 10;
* public final static int DECEMBER = 11;
可以获取时间,当然也可以设置时间,设定时间日期等字段,不要对Date
设定,应使用Calendar
,同样需要注意月份
Calendar calendar =Calendar.getInstance();
calendar.set(1999,Calendar.NOVEMBER,28);
System.out.println(calendar.get(Calendar.YEAR) + "-" +
(calendar.get(Calendar.MONTH)+1) + "-" +
calendar.get(Calendar.DATE));
需要注意的是,在设置时间的时候,月份参数若填入的是int型数据,系统将默认编译为月份列举值
在取得一个Calendar
实例后,可以使用add()
方法来对时间进行改变
calendar.add(Calendar.YEAR, -1);
calendar.add(Calendar.MONTH, +1);
calendar.add(Calendar.DATE, -3);
System.out.println(calendar.get(Calendar.YEAR) + "-" +
(calendar.get(Calendar.MONTH)+1) + "-" +
calendar.get(Calendar.DATE));
在年份上-1,月份上+1,日期上-3,最后得到的结果就是
也可以使用roll()
方法来对日期进行加减,但是只能对某个字段进行操作。例如设置时间2019/03/31,然后对其执行calendar.roll(Calendar.DATE,1)
,意思是在日期(31号)上进行加1,但是时间中是没有32号的,所以最终的结果是2019/03/01,并不会对月份进行+1的改变。
Calendar calendar = Calendar.getInstance();
calendar.set(2019,Calendar.MARCH,31);
calendar.roll(calendar.DATE, +1);
System.out.println(calendar.get(Calendar.YEAR) + "-" +
(calendar.get(Calendar.MONTH)+1) + "-" +
calendar.get(Calendar.DATE));