1. Java日期处理基础与Date类详解
作为一名Java开发者,处理日期和时间是日常开发中最常见的需求之一。Java提供了多个日期时间处理类,其中最基础的就是java.util.Date类。虽然Java 8之后引入了全新的java.time包,但理解这些传统类的用法仍然很有必要。
1.1 Date类的基本使用
要使用Date类,首先需要导入java.util.Date包。创建Date对象最简单的方式就是使用无参构造函数:
java复制import java.util.Date;
public class Main {
public static void main(String[] args) {
Date currentDate = new Date();
System.out.println("当前时间: " + currentDate);
}
}
这段代码会输出当前系统时间,格式类似于"Tue Mar 21 14:25:36 CST 2023"。这种格式虽然包含了完整的时间信息,但对用户不太友好。
注意:Date类的大多数构造函数和方法已经被标记为@Deprecated(弃用),这意味着虽然现在还能用,但在未来版本中可能会被移除。新代码建议使用java.time包中的类。
1.2 本地化时间显示
Date类提供了一个toLocaleString()方法用于本地化显示时间:
java复制System.out.println("本地化时间: " + currentDate.toLocaleString());
在我的中文系统上,这会输出类似"2023年3月21日 下午2:25:36"的格式。但要注意:
- 这个方法已经被弃用,因为它依赖于本地系统设置,可能导致不同系统显示格式不一致
- 输出格式无法自定义,灵活性差
- 在多语言环境下行为不可预测
1.3 时间戳与格林威治时间
Date类内部实际上使用一个long型变量来存储时间,这个值表示自1970年1月1日00:00:00 GMT以来的毫秒数,也就是我们常说的"时间戳"。
获取这个时间戳值:
java复制long timestamp = currentDate.getTime();
System.out.println("时间戳: " + timestamp);
输出结果类似于"1679387136000"这样的长整型数字。时间戳在系统间传递时间信息时非常有用,因为它与时区无关。
获取格林威治时间(GMT):
java复制System.out.println("GMT时间: " + currentDate.toGMTString());
同样要注意,toGMTString()方法也已经被弃用。它会输出类似"21 Mar 2023 06:25:36 GMT"的字符串。
1.4 创建特定日期对象
虽然不推荐,但Date类允许我们创建表示特定日期的对象:
java复制Date customDate = new Date(126, 2, 17); // 2026年3月17日
这里有两个"坑"需要注意:
- 年份参数需要减去1900,所以2026年要传入126
- 月份是从0开始的,所以3月要传入2
这种设计非常反直觉,也是Date类被诟病的原因之一。更直观的做法是使用Calendar类来设置日期(后面会介绍)。
1.5 日期比较
Date类提供了几种比较日期的方法:
java复制Date date1 = new Date(126, 2, 17); // 2026-03-17
Date date2 = new Date(125, 2, 17); // 2025-03-17
System.out.println("date1在date2之前? " + date1.before(date2));
System.out.println("date1在date2之后? " + date1.afte
