一文彻底搞懂Java日期时间类详解
作者:青玉䅁
前言
最近在实习过程中遇到了许多处理日期时间相关的需求,例如时间的加减及时间格式的互相转换。Java早期通过使用Date来计算时间,后来大部分Date类的方法都过时了,又转而希望用Calendar类代替Date类,然而Calendar类也是不尽如人意。因此专门在本文中对Java中Date类的基本概念、常见操作及相关类进行总结和归纳,方便日后的开发,希望对大家有所帮助。
一、Date类
1. 基本概念
java.util 包提供了 Date 类来封装当前的日期和时间。 Date 类提供两个构造函数来实例化 Date 对象。
第一个构造函数使用当前日期和时间来初始化对象。
Date( )
第二个构造函数接收一个参数,该参数是从1970年1月1日起的毫秒数。
Date(long millisec)
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使用以下三种方法来比较两个日期:
- 使用 getTime() 方法获取两个日期(自1970年1月1日经历的毫秒数值),然后比较这两个值。
- 使用方法 before(),after() 和 equals()。例如,一个月的12号比18号早,则 new Date(99, 2, 12).before(new Date (99, 2, 18)) 返回true。
- 使用 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:11 DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); } }
2.2 DateFormat类常用方法
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)周一(2),中国开始为周一,因此可以-1使用。
在Calendar类中,月份的表示是以0-11代表1-12月(可以+1使用)。
日期是有大小关系的,时间靠后,时间越大。
总结
Java早期通过使用Date来计算时间,后来大部分Date类的方法都过时了,又转而希望用Calendar类代替Date类,然而Calendar类也是不尽如人意。因此专门在本文中对Java中Date类的基本概念、常见操作及相关类进行总结和归纳,方便日后的开发,希望对大家有所帮助。
到此这篇关于Java日期时间类的文章就介绍到这了,更多相关Java日期时间类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!