文章目录
时间日期类依赖关系
主要的类有:
Date类负责时间的表示,在计算机中,时间的表示是一个较大的概念,现有的系统基本都是利用从1970.1.1 00:00:00 到当前时间的毫秒数进行计时,这个时间称为epoch。在后文中如果没有明确说明,毫秒数就是指从1970年到对应时间的毫秒数。在Java 的Date类内部其实也是一个毫秒数,对外表现为一个Date对象。
Calendar是一个工具类,负责对Date类进行修改等操作,以及从Date类中提取年月日等时间的特定信息。
DateFormat 则负责日期的转换,比如读取特定格式的字符串,转换成date对象,或者将date对象按照指定的格式转成字符串。
util
Date
使用 java.util.Date 表示日期与时间,其承载了毫秒级精度的 Unix 时间。内部主要是一个long值存储距离纪元时的毫秒数。绝大多数方法都是过时的。
构造方法
public class Date{
private transient long fastTime;
Date(){
this(System.currentTimeMillis());
}
Date(long date){
fastTime = date;
}
//……
}
常用方法
方法 | 描述 |
---|---|
boolean after(Date date) | 如果调用Date对象包含的日期晚于date指定的日期,则返回true,否则返回false。 |
boolean before(Date date) | 如果调用Date对象包含的日期早于date指定的日期,则返回true,否则返回false。 |
int compareTo(Date date) | 将调用对象的值与date的值进行比较。 如果值相等则返回0。 如果调用对象早于date,则返回负值。 如果调用对象晚于date,则返回正值。 |
int compareTo(Object obj) | 如果obj对象是Date类对象,则与compareTo(Date)操作相同。 否则,它会抛出ClassCastException。 |
boolean equals(Object date) | 如果调用Date对象包含与date指定的时间和日期相同的时间和日期,则返回true,否则返回false。 |
long getTime() | 返回自1970年1月1日以来经过的毫秒数。 |
void setTime(long time) | 设置时间指定的时间和日期,表示从1970年1月1日午夜开始的经过时间(以毫秒为单位)。 |
static Date from(Instant instant) | 从Instant对象获取一个Date的实例。jdk1.8新增 |
Instant toInstant() | 将此Date对象转换为Instant 。jdk1.8新增 |
日期比较
Java使用以下三种方法来比较两个日期:
- 使用 getTime() 方法获取两个日期(自1970年1月1日经历的毫秒数值),然后比较这两个值。
- 使用方法before(),after() 和 equals()。例如,一个月的12号比18号早,则 new Date(99, 2,
12).before(new Date (99, 2, 18)) 返回true。 - 使用 compareTo() 方法,它是由Comparable 接口定义的,Date 类实现了这个接口。
TimeZone
时区(24个,如Asia/shanghai)
//获取默认时区
TimeZone.getDefault();
Locale
国家(或地区)和语言(如zh_CN)
// 获取默认国家和语言
Locale.getDefault();
Calendar
Calendar 日期和时间操作的主要类,是抽象类,提供了多个静态方法,可以获取Calendar实例。
与Date类似,Calendar内部也有一个表示时刻的毫秒数,还定义了一个数组(长度17),表示日历中各个字段的值。
相比较于 java.util.Date,java.util.Calendar 除了承载毫秒级的 Unix 时间,还承载了时区信息(默认使用系统的时区),并且,提供了诸多接口:“年、月、日、时、分、秒” 字段的获取与设置,时区设置,日期与时间的偏移调整。
从JDK1.1版本开始,在处理日期和时间时,系统推荐使用Calendar类进行实现。在设计上,Calendar类的功能要比Date类强大很多,而且在实现方式上也比Date类要复杂一些
Calendar类是一个抽象类,在实际使用时实现特定的子类的对象,创建对象的过程对程序员来说是透明的,只需要使用getInstance方法创建即可。
proteted long time;
proteted int fields[];
// fields中存放的是下面这些字段的值,给Calendar
Calendar.YEAR,
Calendar.MONTH,
Calendar.DAY_OF_MONTH,
Calendar.DAY_OF_WEEK,
Calendar.HOUR_OF_DAY,
Calendar.MINUTE,
Calendar.SECOND,
Calendar.MILLISECOND
Calendar还支持根据字段增加减少时间(负数表示减少)。
Calendar.getInstance().add(Calendar.MONTH,-2); //
Calendar做了一项非常繁琐的工作,根据TimeZone 和 Locale 再绝对时间毫秒数和日历字段之间自动进行转换。
使用方式
可以通过Calendar实例获取这些值(Calendar会根据时区,地区语言进行转换)。
@Test
public void testCalendar() {
//空构造函数,会获取当前的。 Calendar.getInstance("Asia/shanghai","zh_CN")
Calendar c1 = Calendar.getInstance();
// 获得年份
int year = c1.get(Calendar.YEAR);
// 获得月份
int month = c1.get(Calendar.MONTH) + 1;
// 获得日期
int date = c1.get(Calendar.DATE);
// 获得小时
int hour = c1.get(Calendar.HOUR_OF_DAY);
// 获得分钟
int minute = c1.get(Calendar.MINUTE);
// 获得秒
int second = c1.get(Calendar.SECOND);
// 获得星期几(注意(这个与Date类是不同的):1代表星期日、2代表星期1、3代表星期二,以此类推)
int day = c1.get(Calendar.DAY_OF_WEEK);
System.out.println("星期" + day + " " + year + "-" + month + "-" + date + " " + hour + ":" + minute + ":" + second);
// 创建一个指定日期的Calendar对象
Calendar c2 = Calendar.getInstance();
c2.set(2020, (12 - 1), 5);
System.out.println(c2.get(Calendar.YEAR) + "年" + (c2.get(Calendar.MONTH) + 1) + "月" + c2.get(Calendar.DATE) + "日");
}
sql
TimeStamp(时间戳)
java.sql.Timestamp继承java.util.Date,表示1970年1月1日午夜以来经过的毫秒数时间戳。可以精度达到纳秒级,保留SQL TIMESTAMP小数秒值的功能,时间戳还提供格式化和解析操作,以支持时间戳值的JDBC转义语法。
在 Java 8 之前,我们使用 java.sql.Timestamp 来表示时间戳对象,可以通过以下方式创建与获取对象:
@Test
public void testTimestamp() {
// 利用系统标准时间创建
Timestamp timestamp = new Timestamp(System.currentTimeMillis());
// 获取自 1970-01-01 00:00:00 GMT 以来的毫秒数
System.out.println(timestamp.getTime());
// 从 Date 对象中创建
Timestamp timestamp1 = new Timestamp((new Date()).getTime());
System.out.println(timestamp1.toString());
}
//输出结果
1607750356429
2020-12-12 13:19:16.429
text(格式转换)
DateFormat
DateFormat(线程不安全) 提供Date和字符串表示之间的转换,主要的两个方法 format(Date d),parse(String s)
Date的字符串表示与TimeZone、Locale都是相关的。
同时与两个格式化风格相关,一个是日期格式化风格,一个是时间格式化风格。
DataFormat是抽象方法,也用工厂方法创建对象。
DateFormat.getTimeInstance();
DateFormat.getDateInstance();
DateFormat.getDateTimeInstance();
其中getTimeInstance只处理时间,getDateInstance只处理日期,getDateTimeInstance处理日期和时间,三种对象的处理结果如下
Calendar calendar = Calendar.getInstance();
//结果是21:34:20
DateFormat.getTimeInstance().format(calendar.getTime());
//结果是2019-02-20
DateFormat.getDateInstance().format(calendar.getTime());
//结果是2019-02-20 21:34:20
DateFormat.getDateTimeInstance().format(calendar.getTime());
SimpleDateFormat
DateFormat是抽象类,能够快速地进行日期与时间的格式化输出和字符串解析,它与以语言无关的方式格式化并解析日期或时间,所以使用其子类SimpleDateFormat实现日期和字符串的相互转换。
/**
* 使用SimpleDateFormat测试日期和字符串的相互转换
*
* @throws ParseException
*/
@Test
public void testSimpleDateFormat() throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 将字符串转化为日期
Date date = sdf.parse("2020-12-05 16:31:39");
System.out.println(date);
// 将日期转化为字符串
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
String str = dateFormat.format(date);
System.out.println(str);
}
//输出结果
Sat Dec 05 16:31:39 CST 2020
2020/12/05 16:31:39