Date类
Java中Date类型有两种:java.util包下的Date类,java.sql包下的Date类
两种Date类的区别和联系
java.util.Date为java.sql.Date类的父类
public class Date extends java.util.Date {
......}
java.sql.Date通常用于表示数据库的日期,相比起java.util.Date,它只包含年、月、日,而不包含具体的时间。
过时方法
在JDK 1.1之前, Date类还有两个附加功能。 它允许将日期解释为年,月,日,小时,分钟和秒值。 它还允许格式化和解析日期字符串。 不幸的是,这些功能的API不适合国际化。
在JDK1.1版本以后,这些用于获取年、月、日、小时、分钟、和秒值的方法被标记为了过时方法
@Deprecated//注释为过时方法,不推荐使用
public int getDay() {
return normalize().getDayOfWeek() - BaseCalendar.SUNDAY;
}
java.util.Date
构造方法
jdk1.1版本之后,构造方法推荐使用(没过时)的就只有两种Date()和Date(long date)两种
public Date() {
//调用Date(long date)方法传递的参数为当前系统时间自1970年1月1日08:00:00 GMT(默认时区东八区)以来的经过毫秒数
this(System.currentTimeMillis());
}
public Date(long date) {
//将Date类自1970年1月1日00:08:00 GMT(默认时区东八区)以来的经过毫秒数设置为date,可以为负数,表示过去的时间
fastTime = date;
}
常用方法
- setTime(long time)方法
- 将此 Date对象设置为表示格林威治标准时间1970年1月1日00:08:00之后的 time毫秒的时间点。
- 无返回值
- getTime()方法
- 返回自此 Date对象表示的1970年1月1日00:08:00 以来的毫秒数。
- 返回值为long
- equals()方法
- 此方法是重写从Object中继承而来的equals方法
- 通过两个Date对象自格林尼治时间以来经过的毫秒数判断两个Date对象是否相等
- 返回值为boolean
public boolean equals(Object obj) {
return obj instanceof Date && getTime() == ((Date) obj).getTime();
}
- toString()方法
Fri Oct 02 13:35:08 CST 2020
- 将此Date对象转换为以下形式的String : dow mon dd hh:mm:ss zzz yyyy
- dow:星期几( Sun, Mon, Tue, Wed, Thu, Fri, Sat )。
mon:月( Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec )。
dd:该月的第几天( 01到31 ),以小数点后两位数。
hh:一天中的小时( 00到23 ),以小数点后两位数。
mm:小时内的分钟( 00到59 ),以小数点后两位数。
ss:分钟内的第二个( 00到61 ),两位十进制数字。
zzz:时区,默认为东八区,显示的是CST,China Standard Time,又名中国标准时间,是中国的标准时间。在时区划分上,属东八区,比协调世界时早8小时。 如果时区信息不可用,则zzz为空 - 也就是说,它根本不包含任何字符。
yyyy:年份。
java.sql.Date
构造方法
注意:该Date没有不带参数的构造方法,初始化时必须传入参数。
public Date(long date) {
//调用父类(java.util.Date)的构造方法设置毫秒数
// If the millisecond date value contains time info, mask it out.
super(date);
}
常用方法
由于java.sql.Date继承了java.util.Date类,它拥有java.util.Date类中的setTime(long time)、getTime()、equals()等方法此处不再重复。
- toString()方法
- 以日期转义格式yyyy-mm-dd格式化日期。
- 返回值为String,返回一个yyyy-mm-dd格式的字符串。
- 调用父类Date的已过时方法getYear()、getMonth()和getDate()来获取年、月、日。
@SuppressWarnings("deprecation")
public String toString () {
int year = super.getYear() + 1900;
int month = super.getMonth() + 1;
int day = super.getDate();
char buf[] = new char[10];
formatDecimalInt(year, buf, 0, 4);
buf[4] = '-';
Date.formatDecimalInt(month, buf, 5, 2);
buf[7] = '-';
Date.formatDecimalInt(day, buf, 8, 2);
return new String(buf);
}
- valueOf(String s)方法
- 该方法为静态方法
- 将JDBC日期转义格式的字符串转换为 Date值。
- 如果给定的日期不是JDBC日期转义格式(yyyy-[m]m-[d]d) 会抛出异常IllegalArgumentException
- 返回一个Date对象
public static Date valueOf(String s) {
if (s == null) {
throw new java.lang.IllegalArgumentException();
}
final int YEAR_LENGTH = 4;
final int MONTH_LENGTH = 2;
final int DAY_LENGTH = 2;
final int MAX_MONTH = 12;
final int MAX_DAY = 31;
Date d = null;
int firstDash = s.indexOf('-');//第一个"-"的位置
int secondDash = s.indexOf('-', firstDash + 1);//第二个"-"的位置
int len = s.length();//String总长度
if ((firstDash > 0) && (secondDash > 0) && (secondDash < len - 1)) {
if (firstDash == YEAR_LENGTH &&
(secondDash - firstDash > 1 && secondDash - firstDash <= MONTH_LENGTH + 1) &&
(len - secondDash > 1 && len - secondDash <= DAY_LENGTH + 1)) {
int year = Integer.parseInt(s, 0, firstDash, 10);//将0~第一个"-"位置的字符串转换为数字
int month = Integer.parseInt(s, firstDash + 1, secondDash, 10);//将第一个"-"位置~第二个"-"位置的字符串转换为数字
int day = Integer.parseInt(s, secondDash + 1, len, 10);//将第二个"-"位置到末尾字符串转换为数字
if ((month >= 1 && month <= MAX_MONTH) && (day >= 1 && day <= MAX_DAY)) {
d = new Date(year - 1900, month - 1, day);//用已过时的构造方法Date(int year, int month, int day)创建对象
}
}
}
if (d == null) {
throw new java.lang.IllegalArgumentException();
}
return d;
}
-
valueOf(LocalDate date)方法
- 该方法为静态方法
- 从LocalDate对象获得Date的实例, Date具有相同的年,月和日值作为给定的LocalDate 。
提供的LocalDate被解释为本地时区的本地日期。 - 如果date为空会抛出异常NullPointerException
- 返回转换后的Date对象
-
toLocalDate()方法
扫描二维码关注公众号,回复: 11882520 查看本文章- 使用此 Date对象中的年,月和日创建 LocalDate实例。
- 是JDK1.8新添加的方法
- 返回一个LocalDate对象