Data类
Java.util包提供了Data类来封装当前的日期和时间。
它有2个构造函数:
- public Date();
- public Date(long millisec);//该参数是从1970年1月1日起的毫秒数。
Date类中常用的方法有:
- boolean after(Date date)
若当调用此方法的Date对象在指定日期之后返回true,否则返回false。 - boolean before(Date date)
若当调用此方法的Date对象在指定日期之前返回true,否则返回false。 - int compareTo(Date date)
比较当调用此方法的Date对象和指定日期,两者相等返回0。调用对象在指定日期之前则返回-1,调用对象在指定日期之后则返回1。 - long getTime()
返回自1970年1月1日00:00:00 GMT以来此Date对象表示的毫秒数。 - void setTime(long time)
用自1970年1月1日00:00:00 GMT以后time毫秒数设置时间和日期。 - String toString( )
把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy 其中: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat)。
下面是代码演示:
public class DateTest {
public static void main(String[] args) {
Date date01 = new Date();
Date date02 = new Date(1000000);
System.out.println(date01.toString());
System.out.println(date02.toString());
System.out.println(date01.after(date02));
System.out.println(date01.before(date02));
System.out.println(date01.compareTo(date02));
System.out.println(date01.getTime());
}
}
输出为:
Thu Apr 12 15:11:55 CST 2018
Thu Jan 01 08:16:40 CST 1970
true
false
1
1523517115400
Calendar类(日历类)
Calendar是一个抽象类,GregorianCalendar是它的一个具体实现类。
- 获取一个Calendar实例方法:Calendar.getInstance(),用这个j静态方法获取的实例就是:GregorianCalendar对象(与new GregorianCalendar获取的结果一致)。
- set()方法:使用下面三个方法把日历定到任何一个时间:
- void set(int year, int month, int date)
- void set(int year, int month, int date, int hour, int minute)
- void set(int year, int month, int date, int hour, int minute, int second)
- void set(int field, int value) //这个方法是修改某一个值
代码演示如下:
Calendar calendar = Calendar.getInstance();
System.out.println(calendar instanceof GregorianCalendar);
System.out.println(calendar.getTime());
calendar.set(2020, 5, 1);
System.out.println(calendar.getTime());
calendar.set(1999, 10, 1, 13, 53);
System.out.println(calendar.getTime());
calendar.set(2002, 12, 11, 15, 34, 30);
System.out.println(calendar.getTime());
calendar.set(Calendar.YEAR, 2017);
System.out.println(calendar.getTime());
输出为:
true
Fri Apr 13 11:38:47 CST 2018
Mon Jun 01 11:38:47 CST 2020
Mon Nov 01 13:53:47 CST 1999
Sat Jan 11 15:34:30 CST 2003
Wed Jan 11 15:34:30 CST 2017
- get()方法:获取年份,月份,小时等信息使用的方法
- int get(Calendar.Month);0表示1月,1表示2月,.....,11表示12月
- int get(Calendar.DAY_OF_MONTH)获得这个月的第几天
- int get(Calendar.DAY_OF_WEEK)获得这个星期的第几天
- int get(Calendar.DAY_OF_YEAR)获得这个年的第几天
- long getTimeMillis()获得当前时间的毫秒表示
代码演示:
Date date = new Date();
calendar.setTime(date);
System.out.println(calendar.getTime());
System.out.println("月份是:" + (calendar.get(Calendar.MONTH) + 1));
System.out.println("获得这个月的第几天:" + calendar.get(Calendar.DAY_OF_MONTH));
System.out.println("获得这个星期的第几天:" + calendar.get(Calendar.DAY_OF_WEEK));
System.out.println("获得这个年的第几天:" + calendar.get(Calendar.DAY_OF_YEAR));
System.out.println(calendar.getTimeInMillis());
输出为:
Fri Apr 13 14:27:00 CST 2018 //这一天是周五
月份是:4
获得这个月的第几天:13
获得这个星期的第几天:6
获得这个年的第几天:103
1494488070158
- 日期计算相应方法:add()、after()和before()
- abstract void add(int field, int amount)
根据日历的规则,为给定的日历字段添加或减去指定的时间量。 - boolean after(Object when)
判断此 Calendar 表示的时间是否在指定 Object 表示的时间之后,返回判断结果。 - boolean before(Object when)
判断此 Calendar 表示的时间是否在指定 Object 表示的时间之前,返回判断结果。
代码演示:
Calendar calendar01 = Calendar.getInstance();
System.out.println(calendar01.getTime());
calendar01.add(Calendar.MONTH, 1);//在当前的月份上加1
System.out.println(calendar01.getTime());
Calendar calendar02 = Calendar.getInstance();
System.out.println(calendar01.after(calendar02));//判读calendar01是否在calendar02之后
System.out.println(calendar01.before(calendar02));//判断calendar01是否在 calendar02之前
输出为:
Fri Apr 13 14:16:29 CST 2018
Sun May 13 14:16:29 CST 2018
true
false
下面来看看Calendar和Date的转换:
Calendar calendar = Calendar.getInstance();
//从一个Calendar对象中获取Date对象
Date date = calendar.getTime();
//将Date对象反应到一个Calendar对象中,
//Calendar/GregorianCalendar没有构造函数可以接受Date对象
//所以我们必须先获得一个实例,然后设置Date对象
calendar.setTime(date);
GregorianCalendar类(标准日历)
GregorianCalendar是Calendar的一个具体子类。提供了世界上大多数国家使用的标准日历系统。GregorianCalendar是在java.util包里。
它的主要方法有:
- int GregorianCalendar.get(GregorianCalendar.YEAR); //得到年
- int GregorianCalendar.get(GregorianCalendar.MONTH); //得到月
- int GregorianCalendar.get(GregorianCalendar.DATE); //得到天
- int GregorianCalendar.get(GregorianCalendar.Day_OF_WEEK); //一星期的第几天
- int GregorianCalendar.get(GregorianCalendar.Day_OF_MONTH); //一月的第几天
- int isLeapYear(int year);//判断某年是否是闰年
GregorianCalendar gc = new GregorianCalendar();
gc.isLeapYear(1993);//false
注意:在GregorianCalendar和Calendar里面,星期天是一周开始的第一天,而0代表现实生活中的一月,11代表十二月。
使用set的时候需要注意的问题:
GregorianCalendar gc = new GregorianCalendar();
gc.isLeapYear(1993);// false
gc.set(2018, 1, 19);
System.out.println(gc.get(Calendar.YEAR) + "-" + (gc.get(Calendar.MONTH)+1)
+ "-" + gc.get(Calendar.DATE));//2018-2-19
gc.set(2018, 4, -2);//用4月的最后一天减去设置的日期,这里就是4月30号减2
System.out.println(gc.get(Calendar.YEAR) + "-" + (gc.get(Calendar.MONTH)+1)
+ "-" + gc.get(Calendar.DATE));//2018-4-28
gc.set(2018, 2, 0);
System.out.println(gc.get(Calendar.YEAR) + "-" + (gc.get(Calendar.MONTH) + 1) +
"-" + gc.get(Calendar.DATE));//2018-2-28
由上可得:
- 日期可以自由加减。如果设为0表示上月的最后一天。
- 月份也可以是负数,规则与日期一样,就不上代码了。(月份就是12月-你设置的那月)
- 实测将年份设为非正数时,会自动变为绝对值+1,不知其意义。
测试题
下面来看看这个例子。
例1:
Date date01 = new Date(1391174450000L); // 2014-1-31 21:20:50
String dateStr = "2014-1-31 21:20:50 ";
SimpleDateFormat dateFormat = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
try {
Date dateTmp = dateFormat.parse(dateStr);
System.out.println(dateTmp);
} catch (ParseException e) {
e.printStackTrace();
}
String dateStrTmp = dateFormat.format(date01);
System.out.println(dateStrTmp);
// 我当前系统的时间
Date date02 = new Date();
System.out.println(date02);
System.out.println(dateFormat.format(date02));
输出为:
Sat Feb 01 05:20:50 CST 2014
2014-01-31 13:20:50
Fri Apr 13 15:34:50 CST 2018
2018-04-13 07:34:50
我的操作系统时区 是"Asia/Shanghai",即GMT+8的北京时间,那么执行日期转字符串的format方法时,由于日期生成时默认是操作系统时区,因此 2014-1-31 21:20:50是北京时间,那么推算到GMT时区,自然是要减8个小时的,即结果(2014-01-31 13:20:50);而执行字符串转日期的parse方法时,由于字符串本身没有时区的概念,因此 2013-1-31 22:17:14就是指GMT(UTC)时间【ps:所有字符串都看做是GMT时间】,那么当转化为日期时要加上默认时区, 即"Asia/Shanghai",因此要加上8个小时。
例2:
Date date03 = new Date(1391174450000L); // 2014-1-31 21:20:50
System.out.println(date03);
Calendar calendar03 = Calendar.getInstance();
calendar03.setTimeZone(TimeZone.getTimeZone("GMT"));
// 或者可以 Calendar calendar =
// Calendar.getInstance(TimeZone.getTimeZone("GMT"));
calendar03.setTime(date03);
System.out.println(calendar03.get(Calendar.HOUR_OF_DAY) + ":"
+ calendar03.get(Calendar.MINUTE));
输出为:
Fri Jan 31 21:20:50 CST 2014
13:20
Calendar不涉及到日期与字符串的转化,因此不像SimpleDateFormat那么复杂,与日期转字符串的思路类似。但是需要注意的是,设置完时区后,我们不能用calendar.getTime()来直接获取Date日期,因为此时的日期与一开始setTime时是相同值,要想获取某时区的时间,正确的做法是用calendar.get()方法,那么我们怎么获得Date类型的日期呢?看例3
例3:
Date date03 = new Date(1391174450000L); // 2014-1-31 21:20:50
System.out.println(date03);
Calendar calendar03 = Calendar.getInstance();
calendar03.setTimeZone(TimeZone.getTimeZone("GMT"));//把时区设置到零时区
// 或者可以 Calendar calendar =
// Calendar.getInstance(TimeZone.getTimeZone("GMT"));
calendar03.setTime(date03);
System.out.println(calendar03.get(Calendar.HOUR_OF_DAY) + ":"
+ calendar03.get(Calendar.MINUTE));
System.out.println(calendar03.getTime());//自己打印的话就是开始设置时候的值
Calendar calendar04 = Calendar.getInstance();
calendar04.set(calendar03.get(Calendar.YEAR),//只有一个一个的获取出来设置到另
//一个Calendar类里面
calendar03.get(Calendar.MONTH),
calendar03.get(Calendar.DAY_OF_MONTH),
calendar03.get(Calendar.HOUR_OF_DAY),
calendar03.get(Calendar.MINUTE),
calendar03.get(Calendar.SECOND));
System.out.println(calendar04.getTime());
输出为:
Fri Jan 31 21:20:50 CST 2014
13:20
Fri Jan 31 21:20:50 CST 2014
Fri Jan 31 13:20:50 CST 2014
请尊重作者劳动成果,转载请标明原文链接:https://www.jianshu.com/p/14172c2c0846