目录

前言

一、Date类

1.基本概念

2. 常见方法

2.1日期比较

2.2 使用 SimpleDateFormat 格式化日期

二、DateFormat类

1. 基本概念

2. 常见方法

2.1 构造方法

2.2DateFormat类常用方法

三、Calendar类

1. 基本概念

2. 常用方法

2.1 构造方法

2.2常用方法

总结


前言

最近在实习过程中遇到了许多处理日期时间相关的需求,例如时间的加减及时间格式的互相转换。Java早期通过使用Date来计算时间,后来大部分Date类的方法都过时了,又转而希望用Calendar类代替Date类,然而Calendar类也是不尽如人意。因此专门在本文中对Java中Date类的基本概念、常见操作及相关类进行总结和归纳,方便日后的开发,希望对大家有所帮助。


一、Date类

1.基本概念

java.util 包提供了 Date 类来封装当前的日期和时间。 Date 类提供两个构造函数来实例化 Date 对象。

第一个构造函数使用当前日期和时间来初始化对象。

Date()

第二个构造函数接收一个参数,该参数是从1970年1月1日起的毫秒数。

Date(longmillisec)

Date date2= new Date();System.out.println(date2);//参数表示1970-01-01 00:00:00到指定时间的毫秒数Date date1 = new Date(14686531L);System.out.println(date1);

2. 常见方法

2.1日期比较

Java使用以下三种方法来比较两个日期:

  1. 使用 getTime() 方法获取两个日期(自1970年1月1日经历的毫秒数值),然后比较这两个值。
  2. 使用方法 before(),after() 和 equals()。例如,一个月的12号比18号早,则 new Date(99, 2, 12).before(new Date (99, 2, 18)) 返回true。
  3. 使用 compareTo() 方法,它是由 Comparable 接口定义的,Date 类实现了这个接口。

2.2 使用 SimpleDateFormat 格式化日期

因为使用Date类与字符串时间相互转化十分困难,因此,可以考虑通过Date类的其他子类来间接进行转换。DateFormat是日期/时间格式化子类的抽象类,它与以语言无关的方式格式化并解析日期或时间,是抽象类。所以使用其子类SimpleDateFormat实现日期和字符串的相互转换。

public static void main(String[] args) throws Exception {// 定义输出格式 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 将字符串转化为日期 Date date = sdf.parse("2023-11-11 11:11:11");System.out.println(date);Date date = new Date();// 将日期转化为字符串SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");String str = sdf.format(date);System.out.println(str);}

二、DateFormat类

1. 基本概念

java.text.DateFormat 是日期/时间格式化子类的抽象类,我们通过这个类可以帮我们完成日期和文本之间的转换,也就是可以在Date对象与String对象之间进行来回转换。

  • 格式化:按照指定的格式,从Date对象转换为String对象。(format)
  • 解析:按照指定的格式,从String对象转换为Date对象。(parse)

2. 常见方法

2.1 构造方法

由于DateFormat为抽象类,不能直接使用,所以需要常用的子类java.text.SimpleDateFormat。这个类需要一个模式(格式)来指定格式化或解析的标准。构造方法为:

public SimpleDateFormat(String pattern):用给定的模式和默认语言环境的日期格式符号构造SimpleDateFormat。

参数pattern是一个字符串,代表日期时间的自定义格式。

格式规则

常用的格式规则为:

标识字母(区分大小写)含义
y
M
d
H
m
s

创建SimpleDateFormat对象的代码如下:

import java.text.DateFormat;import java.text.SimpleDateFormat;public class Demo02SimpleDateFormat {public static void main(String[] args) {// 对应的日期格式如:2023-11-11 11:11:11DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");}}

2.2DateFormat类常用方法

DateFormat类的常用方法有:

1. public String format(Date date):将Date对象格式化为字符串。

format方法的代码如下:

import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.Date;/* 把Date对象转换成String*/public class Demo03DateFormatMethod {public static void main(String[] args) {Date date = new Date();// 创建日期格式化对象,在获取格式化对象时可以指定风格DateFormat df = new SimpleDateFormat("yyyy年MM月dd日");String str = df.format(date);System.out.println(str); // 2020年09月19日}}

2. public Date parse(String source)将字符串解析为Date对象。

parse方法的代码如下:

import java.text.DateFormat;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;/* 把String转换成Date对象*/public class Demo04DateFormatMethod {public static void main(String[] args) throws ParseException {DateFormat df = new SimpleDateFormat("yyyy年MM月dd日");String str = "2023年11月11日";Date date = df.parse(str);System.out.println(date); // Tue Dec 11 00:00:00 CST 2023}}

三、Calendar类

1. 基本概念

我们现在已经能够格式化并创建一个日期对象了,但是我们如何才能设置和获取日期数据的特定部分呢,比如说小时,日,或者分钟? 我们又如何在日期的这些部分加上或者减去值呢? 答案是使用Calendar 类。

Calendar类的功能要比Date类强大很多,而且在实现方式上也比Date类要复杂一些。

Calendar类是一个抽象类,在实际使用时实现特定的子类的对象,创建对象的过程对程序员来说是透明的,只需要使用getInstance方法创建即可。

java.util.Calendar是日历类,在Date后出现,替换掉了许多Date的方法。该类将所有可能用到的时间信息封装为静态成员变量,方便获取。日历类就是方便获取各个时间属性的。

2. 常用方法

2.1 构造方法

Calendar为抽象类,由于语言敏感性,Calendar类在创建对象时并非直接创建,而是通过静态方法创建,返回子类对象,如下:

Calendar静态方法

  • public static Calendar getInstance():使用默认时区和语言环境获得一个日历

例如:

import java.util.Calendar;public class Demo06CalendarInit {public static void main(String[] args) {Calendar cal = Calendar.getInstance();}}

2.2常用方法

根据Calendar类的API文档,常用方法有:

  • public int get(int field):返回给定日历字段的值。
  • public void set(int field, int value):将给定的日历字段设置为给定值。
  • public abstract void add(int field, int amount):根据日历的规则,为给定的日历字段添加或减去指定的时间量。
  • public Date getTime():返回一个表示此Calendar时间值(从历元到现在的毫秒偏移量)的Date对象。

Calendar类中提供很多成员常量,代表给定的日历字段:

字段值含义
YEAR
MONTH月(从0开始,可以+1使用)
DAY_OF_MONTH月中的天(几号)
HOUR时(12小时制)
HOUR_OF_DAY时(24小时制)
MINUTE
SECOND
DAY_OF_WEEK周中的天(周几,周日为1,可以-1使用)

1.get/set方法

get方法用来获取指定字段的值,set方法用来设置指定字段的值。代码实例如下:

import java.util.Calendar;public class Demo {public static void main(String[] args) {// 创建Calendar对象Calendar cal = Calendar.getInstance();// 获取年 int year = cal.get(Calendar.YEAR);// 获取月int month = cal.get(Calendar.MONTH) + 1;// 获取日int dayOfMonth = cal.get(Calendar.DAY_OF_MONTH);System.out.print(year + "年" + month + "月" + dayOfMonth + "日");}}
import java.util.Calendar;public class Demo07CalendarMethod {public static void main(String[] args) {Calendar cal = Calendar.getInstance();// 设置年cal.set(Calendar.YEAR, 2023);// 获取年int year = cal.get(Calendar.YEAR);// 获取月int month = cal.get(Calendar.MONTH) + 1;// 获取日int dayOfMonth = cal.get(Calendar.DAY_OF_MONTH);System.out.print(year + "年" + month + "月" + dayOfMonth + "日");}}

2. add方法

add方法可以对指定日历字段的值进行加减操作,如果第二个参数为正数则加上偏移量,如果为负数则减去偏移量。代码如:

import java.util.Calendar;public class Demo08CalendarMethod {public static void main(String[] args) {Calendar cal = Calendar.getInstance();// 获取年int year = cal.get(Calendar.YEAR);// 获取月int month = cal.get(Calendar.MONTH) + 1;// 获取日int dayOfMonth = cal.get(Calendar.DAY_OF_MONTH);System.out.println(year + "年" + month + "月" + dayOfMonth + "日");// 使用add方法cal.add(Calendar.DAY_OF_MONTH, 5); // 加5天cal.add(Calendar.YEAR, -2); // 减2年// 获取年year = cal.get(Calendar.YEAR);// 获取月month = cal.get(Calendar.MONTH) + 1;// 获取日dayOfMonth = cal.get(Calendar.DAY_OF_MONTH);System.out.println(year + "年" + month + "月" + dayOfMonth + "日");}}

3. getTime方法:返回对应的Date对象

Calendar中的getTime方法并不是获取毫秒时刻,而是拿到对应的Date对象。

import java.util.Calendar;import java.util.Date;public class Demo {public static void main(String[] args) {Calendar cal = Calendar.getInstance();Date date = cal.getTime();System.out.println(date); }}

注意事项:

  1. ​ 西方星期的开始为周日(1)周一(2),中国开始为周一,因此可以-1使用。
  2. ​ 在Calendar类中,月份的表示是以0-11代表1-12月(可以+1使用)。
  3. ​ 日期是有大小关系的,时间靠后,时间越大。

总结

Java早期通过使用Date来计算时间,后来大部分Date类的方法都过时了,又转而希望用Calendar类代替Date类,然而Calendar类也是不尽如人意。因此专门在本文中对Java中Date类的基本概念、常见操作及相关类进行总结和归纳,方便日后的开发,希望对大家有所帮助。