Java日期操作全解析:从Date类到DateFormat类的使用技巧与国际化处理
1.Java中日期的概述

日期是Java中非常复杂的内容。对于不同语言和国家环境下的日期来说,日期的国际化、日期与时间的转换、日期的加减法、日期的显示格式等都非常复杂。问题。
在Java中,操作日期主要涉及以下几个类:
1.java.util.日期
Date 类表示特定的时间瞬间,精确到毫秒。从 JDK 1.1 开始,您应该使用 Calendar 类在日期和时间字段之间进行转换,并使用 DateFormat 类来格式化和解析日期字符串。 Date 中将日期解释为年、月、日、小时、分钟和秒值的方法已被弃用。
2. java.text.DateFormat(抽象类)
DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化和解析日期或时间。日期/时间格式化子类(例如 SimpleDateFormat)允许格式化(即日期->文本)、解析(文本->日期)和规范化。将日期表示为 Date 对象,或表示为自 1970 年 1 月 1 日 00:00:00 GMT(格林威治标准时间)以来的毫秒数。
3. java.text.SimpleDateFormat(DateFormat的直接子类)
SimpleDateFormat 是一个具体类,用于以与语言环境相关的方式格式化和解析日期。它允许格式化(日期->文本)、解析(文本->日期)和规范化。
SimpleDateFormat 允许选择任何用户定义的日期时间格式模式。但是,仍然建议通过 DateFormat 中的 getTimeInstance、getDateInstance 或 getDateTimeInstance 创建新的日期时间格式化程序。
4. java.util.Calendar(抽象类)
Calendar类是一个抽象类,它提供了一些用于在特定时刻与一组日历字段如YEAR、MONTH、DAY_OF_MONTH、HOUR等之间进行转换的方法,并提供了一些操作日历字段的方法(如获取日期)下周)方法。瞬间可以表示为毫秒值,它是相对于纪元(格林尼治标准时间 1970 年 1 月 1 日 00:00:00.000,公历)的偏移量。
与其他区域设置敏感的类一样,Calendar 提供了一个类方法 getInstance 来获取该类型的通用对象。 Calendar 的 getInstance 方法返回一个 Calendar 对象,该对象的日历字段已使用当前日期和时间进行初始化。
5. java.util.GregorianCalendar(日历的直接子类)
GregorianCalendar 是 Calendar 的具体子类,提供世界上大多数国家/地区使用的标准日历系统。
GregorianCalendar 是一种混合日历,在单个不连续性下同时支持儒略历和公历系统,默认情况下对应于创建公历时的公历日期(有些国家成立于 1582 年 10 月 15 日,其他国家则晚一些) 。调用者可以通过调用 setGregorianChange() 来更改开始日期。
2.java.util.Date的使用
1.java.util.Date的API介绍
java.util.Date 类表示特定的时间点,精确到毫秒。提供了很多方法,但其中很多已经过时,不推荐。这里只列出还没有过时的方法:
构造函数总结
-------------
日期()
分配一个 Date 对象并用当前时间初始化该对象,表示分配该对象时的时间(精确到毫秒)。
日期(长日期)
分配并初始化一个 Date 对象,以表示自称为“纪元”的标准基准时间(格林威治标准时间 1970 年 1 月 1 日 00:00:00)以来指定的毫秒数。
方法总结
-------------
布尔值 after(日期时间)
测试该日期是否在指定日期之后。
布尔值 before(日期时间)
测试该日期是否早于指定日期。
对象克隆()
返回此对象的副本。
intcompareTo(日期另一个日期)
比较两个日期的顺序。
布尔等于(对象 obj)
比较两个日期是否相等。
长 getTime()
返回此 Date 对象表示的自 1970 年 1 月 1 日 00:00:00 GMT 以来的毫秒数。
int 哈希码()
返回该对象的哈希码值。
void setTime(长时间)
将此 Date 对象设置为表示 1970 年 1 月 1 日 00:00:00 GMT 之后的时间点(毫秒)。
字符串转字符串()
将此 Date 对象转换为以下形式的字符串: dow mon dd hh:mm:ss zzz yyyy 其中:
dow 是一周中的某一天(周日、周一、周二、周三、周四、周五、周六)。
mon 是月份(一月、二月、三月、四月、五月、六月、七月、八月、九月、十月、十一月、十二月)。
dd 是一个月中的第几天(01 到 31),显示为两位十进制数。
hh 是一天中的小时(00 到 23),显示为两位十进制数。
mm 是一小时中的分钟(00 到 59),显示为两位小数。
ss 是以分钟为单位的秒数(00 到 61),显示为两位十进制数。
zzz 是时区(并且可以反映夏令时)。标准时区缩写包括那些由方法解析识别的缩写。如果未提供时区信息,则 zzz 为空,不包含任何字符。
yyyy 是年份,显示为 4 位十进制数。
以下是 Date 类的综合示例:
导入 java.util.Date;
公共类测试日期{
公共静态无效主(字符串参数[]){
TestDate nowDate = new TestDate();
nowDate.getSystemCurrentTime();
nowDate.getCurrentDate();
公共无效getSystemCurrentTime(){
System.out.println("----获取当前系统时间----");
System.out.println("系统当前时间 = " + System.currentTimeMillis());
公共无效getCurrentDate(){
System.out.println("----获取系统当前日期----");
//创建并初始化一个日期(初始值为当前日期)
日期日期 = 新日期();
System.out.println("当前日期 = " + date.toString());
System.out.println("自1970年1月1日0:00:00起的毫秒数 = " + date.getTime());
运行结果:
----获取当前系统时间----
系统当前时间 = 1196413077278
----获取系统当前日期----
当前日期 = 2007 年 11 月 30 日星期五 16:57:57 CST
自 1970 年 1 月 1 日 0:00:00 起经过的毫秒数 = 1196413077278
进程已完成,退出代码为 0
2.java.text.DateFormat抽象类的使用
DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化和解析日期或时间。日期/时间格式化子类(例如 SimpleDateFormat)允许格式化(即日期->文本)、解析(文本->日期)和规范化。将日期表示为 Date 对象,或表示为自 1970 年 1 月 1 日 00:00:00 GMT(格林威治标准时间)以来的毫秒数。
DateFormat 提供了许多类方法来根据默认或给定的区域设置和多种格式化样式获取默认的日期/时间格式化程序。格式样式包括 FULL、LONG、MEDIUM 和 SHORT。方法描述中提供了使用这些样式的更多细节和示例。
DateFormat 有助于在任何区域设置中格式化和解析日期。对于月份、星期几,甚至日历格式(农历和太阳),代码可以完全独立于区域设置约定。
要格式化当前区域设置中的日期,请使用静态工厂方法之一:
myString = DateFormat.getDateInstance().format(myDate);
如果要格式化多个日期,则获取该格式并多次使用它会更有效,这样系统就不必多次获取有关环境语言和国家惯例的信息。
DateFormat df = DateFormat.getDateInstance();
for (int i = 0; i < myDate.length; ++i) {
输出.println(df.format(myDate[i]) + "; ");
要针对不同区域设置设置日期格式,请在调用 getDateInstance() 时指定它。
DateFormat df = DateFormat.getDateInstance(DateFormat.LONG, Locale.FRANCE);
还可以使用DateFormat进行分析。
myDate = df.parse(myString);
使用 getDateInstance 获取国家/地区的标准日期格式。还提供了一些其他静态工厂方法。使用 getTimeInstance 获取国家/地区的时间格式。使用 getDateTimeInstance 获取日期和时间格式。可以将不同的选项传递到这些工厂方法中来控制结果的长度(从 SHORT 到 MEDIUM 到 LONG 到 FULL)。确切的结果取决于区域设置,但通常:
SHORT 完全是一个数字,例如 12.13.52 或 3:30pm
MEDIUM 较长,例如 Jan 12, 1952
LONG 更长,例如 January 12, 1952 或 3:30:32pm
FULL 是完整指定的,例如 Tuesday, April 12, 1952 AD 或 3:30:42pm PST。
如果您愿意,还可以在格式上设置时区。如果您想对格式化或解析施加更多控制(或给予用户更多控制),您可以尝试将从工厂方法获取的 DateFormat 转换为 SimpleDateFormat。这适用于大多数国家;只要记住将其放在 try 块中,以防遇到特殊格式。
您还可以使用 ParsePosition 和 FieldPosition 的解析和格式化方法的形式来: 单步执行字符串的各个部分。对齐任何特定字段,或找出屏幕上选择字符串的位置。
DateFormat 不是同步的。建议为每个线程创建单独的格式实例。如果多个线程同时访问一种格式,则它必须保持外部同步。
3. java.text.SimpleDateFormat(DateFormat的直接子类)的使用
SimpleDateFormat 是一个具体类,用于以与语言环境相关的方式格式化和解析日期。它允许格式化(日期->文本)、解析(文本->日期)和规范化。
SimpleDateFormat 允许选择任何用户定义的日期时间格式模式。但是,仍然建议通过 DateFormat 中的 getTimeInstance、getDateInstance 或 getDateTimeInstance 创建新的日期时间格式化程序。每个这样的类方法都可以返回以默认格式模式初始化的日期/时间格式化程序。您可以使用 applyPattern 方法根据需要修改格式模式。有关使用这些方法的更多信息,请参阅 DateFormat。
日期和时间模式
日期和时间格式由日期和时间模式字符串指定。在日期和时间模式字符串中,不带引号的字母“A”到“Z”以及“a”到“z”被解释为模式字母,并用于表示日期或时间字符串元素。文本可以用单引号 (') 括起来以避免解释。 “''”代表单引号。所有其他字符均不被解释;它们只是在格式化过程中复制到输出字符串,或者在解析过程中与输入字符串进行匹配。
定义了以下模式字母(保留所有其他字符“A”到“Z”和“a”到“z”):
字母日期或时间元素表示的示例
G时代标识符文字AD
y1996 年; 96
M 年月 7 月;七月; 07
w 一年中的周数Number 27
W 月份中的周数 数字 2
D 一年中的天数 数字 189
d 该月的天数 数字 10
F 星期几 数字 2
E 一周中的某一天文本星期二;星期二
am/pm 标记文本 PM
H 一天中的小时 (0-23) 数字 0
k 一天中的小时 (1-24) 数字 24
K am/pm 的小时数 (0-11) 数字 0
h am/pm 小时 (1-12) 数字 12
m 一小时内的分钟数Number 30
s 以分钟为单位的秒数Number 55
S 毫秒数Number 978
z 时区一般时区太平洋标准时间;太平洋标准时间; GMT-08:00
Z时区 RFC 822 时区 -0800
更多参考信息,可以查看JDK API文档。下面给出了一个综合示例:
导入 java.util.Date;
导入java.util.Locale;
导入 java.text.DateFormat;
导入 java.text.ParseException;
导入 java.text.SimpleDateFormat;
公共类 TestSimpleDateFormat {
公共静态无效主(字符串参数[])抛出ParseException {
TestSimpleDateFormat 测试 = new TestSimpleDateFormat();
测试.testDateFormat();
公共无效testDateFormat()抛出ParseException {
//创建日期
日期日期 = 新日期();
//创建不同的日期格式
DateFormat df1 = DateFormat.getInstance();
DateFormat df2 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss EE");
DateFormat df3 = DateFormat.getDateInstance(DateFormat.FULL, Locale.CHINA); //生成指定国家指定长度的日期格式。不同的长度将导致显示日期的完整性不同。
DateFormat df4 = new SimpleDateFormat("yyyy 年 MM 月 dd 日 hh 小时 mm 分钟 ss 秒 EE", Locale.CHINA);
DateFormat df5 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss EEEEEE", Locale.US);
DateFormat df6 = new SimpleDateFormat("yyyy-MM-dd");
DateFormat df7 = new SimpleDateFormat("yyyy 年 MM 月 dd 日");
//输出不同格式的日期
System.out.println("--------以不同格式输出日期-----");
System.out.println("按照Java默认的日期格式,默认区域:" + df1.format(date));
System.out.println("按照指定格式yyyy-MM-dd hh:mm:ss EE,系统默认区域:" + df2.format(date));
System.out.println("FULL模式根据日期,区域设置为中文:" + df3.format(date));
System.out.println("按照指定格式yyyy年MM月dd日hh时mm分ss秒EE,区域为中文:" + df4.format(date));
System.out.println("按照指定格式yyyy-MM-dd hh:mm:ss EE,地区为美国:" + df5.format(date));
System.out.println("按照指定格式yyyy-MM-dd,系统默认区域:" + df6.format(date));
//将符合格式的字符串转换为日期。如果格式不匹配,就会出现错误。
日期 date1 = df1.parse("07-11-30 2:32 PM");