java 日期类
java.util.Date
Date
有两个附加功能。 它允许将日期解释为年,月,日,小时,分钟和第二个值。 它还允许格式化和解析日期字符串。 但这些功能的API不适合国际化。 从JDK 1.1开始, Calendar
类应该用于在日期和时间字段之间进行转换,并且DateFormat
类应用于格式化和解析日期字符串。 在相应的方法Date
被弃用。
一些计算机标准是根据格林尼治标准时间(GMT)定义的,相当于世界时间(UT)。
- 在类的所有方法
Date
接受或返回年,月,日,小时,分钟和秒值,以下表述中使用:
y年代表整数y
- 1900
。一个月由0到11的整数表示; 0是1月,1是2月,等等; 11月12日。
日期(月的一天)以通常的方式从1到31的整数表示。
一小时由0到23之间的整数表示。因此,从午夜到凌晨1点的时间是小时0,从中午到下午1点的小时是12小时。
一般以0〜59的整数表示。
第二个由0到61的整数表示; 值60和61仅发生在闰秒上,甚至仅在实际上正确跟踪闰秒的Java实现中发生。 由于目前引入闰秒的方式,在同一分钟内不会发生两个闰秒,但是本规范遵循ISO C的日期和时间约定。
构造方法
构造方法 | 描述 |
---|---|
Date() |
分配一个 Date 对象,并初始化它,以便它代表它被分配的时间,测量到最近的毫秒。 |
Date(long date) |
分配一个 Date 对象,并将其初始化为表示自称为“时代”的标准基准时间以后的指定毫秒数,即1970年1月1日00:00:00 GMT。 使用System.currentTimeMillis() 获得 |
常用方法
Modifier and Type | 方法 | 描述 |
---|---|---|
boolean |
after(Date when) |
测试此日期是否在指定日期之后。 |
boolean |
before(Date when) |
测试此日期是否在指定日期之前。 |
Object |
clone() |
返回此对象的副本。 |
int |
compareTo(Date anotherDate) |
比较两个日期的顺序。 |
boolean |
equals(Object obj) |
比较两个日期的相等性。 |
long |
getTime() |
返回自1970年1月1日以来,由此 Date 对象表示的00:00:00 GMT的毫秒 数 。 |
String |
toString() |
将此 Date对象转换为 String的形式: |
int |
getYear() |
日期表示的年份减去 1900。已弃用。由Calendar.get(Calendar.YEAR) - 1900 。 |
int |
getMonth() |
此日期所表示的月份,返回的值在 0 和 11 之间,值 0 表示 1 月。 已弃用。由Calendar.get(Calendar.MONTH) 取代。 |
String |
toLocaleString() |
此日期的字符串表示形式,使用区域设置约定。已弃用,由DateFormat.format(Date date) 替换。 |
int |
getDate() |
返回此 Date 对象表示的月份中的某一天。返回的值在 1 和 31 之间,表示包含或开始于此 Date 对象表示的时间的月份中的某一天。 已弃用。由Calendar.get(Calendar.DAY_OF_MONTH) 取代 。 |
int |
getDay() |
返回此日期表示的周中的某一天,返回值 (0 = Sunday, 1 = Monday, ···) 。已弃用。由Calendar.get(Calendar.DAY_OF_WEEK) 取代 。 |
int |
getHours() |
此日期所表示的小时。已弃用。由Calendar.get(Calendar.HOUR_OF_DAY) 取代 。 |
int |
getMinutes() |
返回此日期所表示的小时已经过去的分钟数。返回值在 0 和 59 之间。 已弃用。由Calendar.get(Calendar.MINUTE) 取代。 |
int |
getMonth() |
此日期所表示的月份。返回的值在 0 和 11 之间,值 0 表示 1 月。 已弃用。由Calendar.get(Calendar.MONTH) 取代。 |
int |
getSeconds() |
返回此日期所表示的分钟已经过去的秒数,返回的值在 0 和 61 之间。已弃用。由Calendar.get(Calendar.SECOND) 取代 |
实例
public class Test {
public static void main(String[] args) {
//java.util.Date:
Date d = new Date();
System.out.println(d); //Sun Aug 08 21:21:32 CST 2021
System.out.println(d.toString()); //Sun Aug 08 21:21:32 CST 2021
System.out.println(d.toGMTString()); //8 Aug 2021 13:21:32 GMT
System.out.println(d.toLocaleString()); //2021-8-8 21:21:32
System.out.println(d.getYear());//121。121+1900=2021
System.out.println(d.getMonth());//7 :返回的值在 0 和 11 之间,值 0 表示 1 月。
//返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。
System.out.println(d.getTime());//1628428892448
System.out.println(System.currentTimeMillis());//1628428892448
}
}
获取时间差一般用System.currentTimeMillis()
,这个方法是静态的,可以类名.方法名
直接调用,无方法体,其具体实现并不是java实现,一般会去衡量一些算法所用的时间
java.sql.Date
一个大约一毫秒值的薄包装,允许JDBC将其标识为SQL DATE
值。 毫秒值表示1970年1月1日00:00:00.000 GMT之后的毫秒数。
为了符合SQL DATE
,由java.sql.Date
实例包装的毫秒值必须通过在实例关联的特定时区中将小时,分钟,秒和毫秒设置为零来“归一化”。
java.sql.Date和java.util.Date的
- 区别:
- java.util.Date:年月日 时分秒
- java.sql.Date:年月日
- 联系:
`java.sql.Date(子类) extends java.util.Date (父类)
构造方法
Date(long date)
使用给定毫秒时间值构造一个Date
对象。- @param date自1970年1月1日00:00:00 GMT以来的毫秒数。
- @see java.lang.System.currentTimeMillis()
转换
相互转化
- util --> sql:
方式1:向下转型
java.util.Date date = new Date(1628431958441L);//创建util.Date的对象
Date date1 = (Date) date;
java.sql.Date date1 = (java.sql.Date) date;
方式2:利用构造器
Date date2 = new Date(date.getTime());Date date2 = new Date(System.currentTimeMillis());👍
- sql --> util:
Date d = new Date(1628431958441L); java.util.Date date3 = d;
字符转换
- String–>java.sql.Date
public static void main(String[] args) {
//(1)String--->java.sql.Date
java.sql.Date date = java.sql.Date.valueOf("2015-9-24");
//(2)java.sql.Date--->java.util.Date
java.util.Date date2 = date;
System.out.println(date2.toString());
}
但代码有局限性,字符串的格式只能是年-月-日
拼接的形式,换成其它类型,就会出现异常
DateFormat
构造方法
-
protected DateFormat()
创建一个新的日期格式。 -
SimpleDateFormat(子类) extends DateFormat(父类是一个抽象类)
-
指定格式化标准
-
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
日期和时间模式
字母 | 日期或时间组件 | 描述 | 示例 |
---|---|---|---|
G |
纪元指示符 | Text | AD |
y |
年 | Year | 1996 ; 96 |
Y |
Week year | Year | 2009 ; 09 |
M |
年中月份(上下文相关sensitive) | Month | July ; Jul ; 07 |
L |
年中月份(独立形式) | Month | July ; Jul ; 07 |
w |
Week in year | Number] | 27 |
W |
Week in month | Number | 2 |
D |
Day in year | Number | 189 |
d |
Day in month | Number | 10 |
F |
一个月中的星期几Day of week in month | Number | 2 |
E |
周中的日名称Day name in week | Text | Tuesday ; Tue |
u |
星期几(1 = Monday, …, 7 = Sunday) | Number | 1 |
a |
上午/下午 标记 | Text | PM |
H |
一天中的小时 (0-23) | Number | 0 |
k |
一天中的小时 (1-24) | Number | 24 |
K |
上午/下午的小时 (0-11) | Number | 0 |
h |
上午/下午的小时 (1-12) | Number | 12 |
m |
Minute in hour | Number | 30 |
s |
Second in minute | Number | 55 |
S |
毫秒 | Number | 978 |
z |
时区Time zone | General time zone | Pacific Standard Time ; PST ; GMT-08:00 |
Z |
时区Time zone | RFC 822 time zone | -0800 |
X |
时区Time zone | ISO 8601 time zone | -08 ; -0800 ; -08:00 |
常用方法
Modifier and Type | 方法 | 描述 |
---|---|---|
Object |
clone() |
重写 Cloneable |
boolean |
equals(Object obj) |
重写 equals |
String |
format(Date date) |
将一个 Date 格式化为日期/时间字符串。 |
abstract StringBuffer |
format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition) |
将一个 Date 格式化为日期/时间字符串。 |
StringBuffer |
format(Object obj, StringBuffer toAppendTo, FieldPosition fieldPosition) |
重写 Format。 |
Calendar |
getCalendar() |
获取与此日期/时间格式器关联的日历。 |
TimeZone |
getTimeZone() |
获取时区。 |
int |
hashCode() |
重写 hashCode |
boolean |
isLenient() |
判断日期/时间解析是否为不严格的。 |
Date |
parse(String source) |
从给定字符串的开始解析文本,以生成一个日期。 |
abstract Date |
parse(String source, ParsePosition pos) |
根据给定的解析位置开始解析日期/时间字符串。 |
Object |
parseObject(String source, ParsePosition pos) |
解析字符串中的文本,以生成一个 Date 。 |
void |
setCalendar(Calendar newCalendar) |
设置此日期格式所使用的日历。 |
void |
setLenient(boolean lenient) |
指定日期/时间解析是否不严格。 |
void |
setNumberFormat(NumberFormat newNumberFormat) |
允许用户设置数字格式器。 |
void |
setTimeZone(TimeZone zone) |
为此 DateFormat 对象的日历设置时区。 |
static Calendar |
getInstance() |
使用默认时区和语言环境获得一个日历。 |
static Calendar |
getInstance([TimeZone zone][, Locale aLocale]) |
使用指定时区和语言环境获得一个日历。每一参数可有可无 |
实例
通过DateFormat可以将日期按照自定义格式输出
public static void main(String[] args) {
//格式化的标准定义:
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//String-->Date
Date d = null;
try {
d = df.parse("2021-8-8 12:26:8");
} catch (ParseException parseException) {
parseException.printStackTrace();
}
System.out.println(d); //Sun Aug 08 12:26:08 CST 2021
//Date-->String
String format = df.format(new Date());
System