主要介绍了 Date、Calenda 类及LocalDate、LocalTime、LocalDateTime类日期时间类的使用,更加推荐使用LocalDate、LocalTime、LocalDateTime类处理日期时间。
Date类
介绍
第一代日期类;java.util 包提供了 Date 类来封装当前的日期和时间。
创建
// 初始化 Date 对象
Date date = new Date();
常用方法
Date 对象创建以后,可以调用下面的方法。
序号 | 方法和描述 |
1 | boolean after(Date date) 若当调用此方法的Date对象在指定日期之后返回true,否则返回false。 |
2 | boolean before(Date date) 若当调用此方法的Date对象在指定日期之前返回true,否则返回false。 |
3 | Object clone( ) 返回此对象的副本。 |
4 | int compareTo(Date date) 比较当调用此方法的Date对象和指定日期。两者相等时候返回0。调用对象在指定日期之前则返回负数。调用对象在指定日期之后则返回正数。 |
5 | int compareTo(Object obj) 若obj是Date类型则操作等同于compareTo(Date) 。否则它抛出ClassCastException。 |
6 | boolean equals(Object date) 当调用此方法的Date对象和指定日期相等时候返回true,否则返回false。 |
7 | long getTime( ) 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。 |
8 | int hashCode( ) 返回此对象的哈希码值。 |
9 | void setTime(long time) 用自1970年1月1日00:00:00 GMT以后time毫秒数设置时间和日期。 |
10 | String toString( ) 把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy 其中: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat)。 |
使用场景
获取当前日期时间
Java中获取当前日期和时间很简单,使用 Date 对象的 toString() 方法来打印当前日期和时间。
例如:
import java.util.Date;
public class DateDemo {
public static void main(String[] args) {
// 初始化 Date 对象
Date date = new Date();
// 使用 toString() 函数显示日期时间
System.out.println(date.toString());
}
}
使用 SimpleDateFormat 格式化日期
SimpleDateFormat 是一个以语言环境敏感的方式来格式化和分析日期的类。
SimpleDateFormat 允许你选择任何用户自定义日期时间格式来运行。
例如:
import java.util.*;
import java.text.*;
public class DateDemo {
public static void main(String[] args) {
Date dNow = new Date( );
//这一行代码确立了转换的格式,其中 yyyy 是完整的公元年,MM 是月份,dd 是日期,HH:mm:ss 是时、分、秒。
//注意:有的格式大写,有的格式小写,例如 MM 是月份,mm 是分;HH 是 24 小时制,而 hh 是 12 小时制。
SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd hh:mm:ss");
System.out.println("当前时间为: " + ft.format(dNow));
}
}
日期和时间的格式化编码
时间模式字符串用来指定时间格式。在此模式中,所有的 ASCII 字母被保留为模式字母,定义如下:
字母 | 描述 | 示例 |
G | 纪元标记 | AD |
y | 四位年份 | 2001 |
M | 月份 | July or 07 |
d | 一个月的日期 | 10 |
h | A.M./P.M. (1~12)格式小时 | 12 |
H | 一天中的小时 (0~23) | 22 |
m | 分钟数 | 30 |
s | 秒数 | 55 |
S | 毫秒数 | 234 |
E | 星期几 | Tuesday |
D | 一年中的日子 | 360 |
F | 一个月中第几周的周几 | 2 (second Wed. in July) |
w | 一年中第几周 | 40 |
W | 一个月中第几周 | 1 |
a | A.M./P.M. 标记 | PM |
k | 一天中的小时(1~24) | 24 |
K | A.M./P.M. (0~11)格式小时 | 10 |
z | 时区 | Eastern Standard Time |
' | 文字定界符 | Delimiter |
" | 单引号 | ` |
使用printf格式化日期
printf 方法可以很轻松地格式化时间和日期。使用两个字母格式,它以 %t 开头并且以下面表格中的一个字母结尾。
- %tY:输出四位数的年份,例如:2023
- %ty:输出两位数的年份,例如:23
- %tm:输出两位数的月份,例如:02
- %tB:输出月份的全名,例如:February
- %tb:输出月份的缩写,例如:Feb
- %tA:输出星期的全名,例如:Wednesday
- %ta:输出星期的缩写,例如:Wed
- %td:输出两位数的日期,例如:24
- %te:输出一位或两位数的日期,例如:24 或 02
- %tH:输出24小时制的小时数,例如:23
- %tI:输出12小时制的小时数,例如:11
- %tM:输出分钟数,例如:45
- %tS:输出秒数,例如:30
- %tp:输出上午还是下午,例如:AM 或 PM
- %tZ:输出时区,例如:GMT+08:00
转换符 | 说明 | 示例 |
%tc | 包括全部日期和时间信息 | 星期六 十月 27 14:21:20 CST 2007 |
%tF | "年-月-日"格式 | 2007-10-27 |
%tD | "月/日/年"格式 | 10/27/07 |
%tr | "HH:MM:SS PM"格式(12时制) | 02:25:51 下午 |
%tT | "HH:MM:SS"格式(24时制) | 14:28:16 |
%tR | "HH:MM"格式(24时制) | 14:28 |
定义日期格式的转换符可以使日期通过指定的转换符生成新字符串。这些日期转换符如下所示:
import java.util.*;
public class DateDemo {
public static void main(String[] args) {
Date date=new Date();
//b的使用,月份简称
String str=String.format(Locale.US,"英文月份简称:%tb",date);
System.out.println(str);
System.out.printf("本地月份简称:%tb%n",date);
//B的使用,月份全称
str=String.format(Locale.US,"英文月份全称:%tB",date);
System.out.println(str);
System.out.printf("本地月份全称:%tB%n",date);
//a的使用,星期简称
str=String.format(Locale.US,"英文星期的简称:%ta",date);
System.out.println(str);
//A的使用,星期全称
System.out.printf("本地星期的简称:%tA%n",date);
//C的使用,年前两位
System.out.printf("年的前两位数字(不足两位前面补0):%tC%n",date);
//y的使用,年后两位
System.out.printf("年的后两位数字(不足两位前面补0):%ty%n",date);
//j的使用,一年的天数
System.out.printf("一年中的天数(即年的第几天):%tj%n",date);
//m的使用,月份
System.out.printf("两位数字的月份(不足两位前面补0):%tm%n",date);
//d的使用,日(二位,不够补零)
System.out.printf("两位数字的日(不足两位前面补0):%td%n",date);
//e的使用,日(一位不补零)
System.out.printf("月份的日(前面不补0):%te",date);
}
}
输出结果为:
英文月份简称:May
本地月份简称:五月
英文月份全称:May
本地月份全称:五月
英文星期的简称:Thu
本地星期的简称:星期四
年的前两位数字(不足两位前面补0):20
年的后两位数字(不足两位前面补0):17
一年中的天数(即年的第几天):124
两位数字的月份(不足两位前面补0):05
两位数字的日(不足两位前面补0):04
月份的日(前面不补0):4
解析字符串为时间
SimpleDateFormat 类有一些附加的方法,特别是parse(),它试图按照给定的SimpleDateFormat 对象的格式化存储来解析字符串。
例如:
import java.util.*;
import java.text.*;
public class DateDemo {
public static void main(String[] args) {
SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd");
String input = args.length == 0 ? "1818-11-11" : args[0];
System.out.print(input + " Parses as ");
Date t;
try {
t = ft.parse(input);
System.out.println(t);
} catch (ParseException e) {
System.out.println("Unparseable using " + ft);
}
}
}
以上实例编译运行结果如下:
$ java DateDemo
1818-11-11 Parses as Wed Nov 11 00:00:00 GMT 1818
$ java DateDemo 2007-12-01
2007-12-01 Parses as Sat Dec 01 00:00:00 GMT 2007
Calenda类
介绍
第二代日期类,是一个抽象类,并且构造器是private,可以通过 getInstance()来获得实例,提供大量的方法和字段,通过getInstance()来获取实例。
创建
创建一个代表系统当前日期的Calendar对象
Calendar c = Calendar.getInstance();//默认是当前日期
创建一个指定日期的Calendar对象
使用Calendar类代表特定的时间,需要首先创建一个Calendar的对象,然后再设定该对象中的年月日参数来完成。
//创建一个代表2009年6月12日的Calendar对象
Calendar c1 = Calendar.getInstance();
c1.set(2009, 6 - 1, 12);
Calendar类对象字段类型
Calendar类中用以下这些常量表示不同的意义,jdk内的很多类其实都是采用的这种思想
常量 | 描述 |
Calendar.YEAR | 年份 |
Calendar.MONTH | 月份 |
Calendar.DATE | 日期 |
Calendar.DAY_OF_MONTH | 日期,和上面的字段意义完全相同 |
Calendar.HOUR | 12小时制的小时 |
Calendar.HOUR_OF_DAY | 24小时制的小时 |
Calendar.MINUTE | 分钟 |
Calendar.SECOND | 秒 |
Calendar.DAY_OF_WEEK | 星期几 |
使用场景
Calendar类对象信息的设置
Set设置
如:
Calendar c1 = Calendar.getInstance();
调用:
public final void set(int year,int month,int date)
c1.set(2009, 6, 12);//把Calendar对象c1的年月日分别设这为:2009、6、12
利用字段类型设置
如果只设定某个字段,例如日期的值,则可以使用如下set方法:
public void set(int field,int value)
把 c1对象代表的日期设置为10号,其它所有的数值会被重新计算
c1.set(Calendar.DATE,10);
把c1对象代表的年份设置为2008年,其他的所有数值会被重新计算
c1.set(Calendar.YEAR,2008);
其他字段属性set的意义以此类推
Add设置
Calendar c1 = Calendar.getInstance();
把c1对象的日期加上10,也就是c1也就表示为10天后的日期,其它所有的数值会被重新计算
c1.add(Calendar.DATE, 10);
把c1对象的日期减去10,也就是c1也就表示为10天前的日期,其它所有的数值会被重新计算
c1.add(Calendar.DATE, -10);
其他字段属性的add的意义以此类推
Calendar类对象信息的获得
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);
LocalDate、LocalTime、LocalDateTime类(推荐使用)
介绍
基于线程安全问题的考虑,Java1.8之后出现了localdate,localdatetime,localtime类,而这些类使用了final来修饰,使得这些类是不可变的,一旦实例化,值就固定了,这些类都在 java.time 包中,并且是不可变的(线程安全的),表示日期、时间和日期时间的类。
- localdate 是针对于年月日的。
- localtime 是针对于时分秒。
- localdatetime 是针对于年月日时分秒。
创建
LocalDate 类
LocalDate 类表示日期,不包含时刻信息。例如,获取当前日期。
LocalDate today = LocalDate.now();
System.out.println("Today's Local date: " + today);
LocalTime类
LocalTime 类表示时间,不包含日期信息。例如,获取当前时间。
LocalTime now = LocalTime.now();
System.out.println("Current Time: " + now);
LocalDateTime 类:
LocalDateTime 类表示日期和时间。例如,获取当前日期和时间。
LocalDateTime now = LocalDateTime.now();
System.out.println("Current Date and Time: " + now);
也可以自己创建日期或时间。
LocalDate date = LocalDate.of(2022, 03, 25);
LocalTime time = LocalTime.of(15, 30);
LocalDateTime dt = LocalDateTime.of(2022, 03, 25, 15, 30);
使用
类名 | 常用方法 | |
LocalDate | LocalDateTime | now():获取当前的日期。 |
of(int year, int month, int dayOfMonth):根据指定的年、月、日创建日期。 | ||
parse() 从字符串解析日期,字符串格式通常为 yyyy-MM-dd。 | ||
getYear():获取年份。 getMonth():获取月份(返回一个 Month 枚举)。 getDayOfMonth():获取月份中的第几天。 | ||
withDayOfMonth()、withMonth() 和 withYear() 方法允许你直接修改日期的某个部分。例如,可以将日期设为某个月的某天,或某一年的某个月。 | ||
isBefore() 和 sAfter() 用于判断某个日期是否在另一个日期之前或之后。 | ||
plusDays(long day):在当前日期上增加指定的天数。 plusWeeks(long week):在当前日期上增加指定的周数。 plusMonths(long ,month):在当前日期上增加指定的月数。 plusYears(long year):在当前日期上增加指定的年数。 | ||
minusDays(long day):在当前日期上增加指定的天数。 minusWeeks(long week):在当前日期上增加指定的周数。 minusMonths(long ,month):在当前日期上增加指定的月数。 minusYears(long year):在当前日期上增加指定的年数。 | ||
isLeapYear(): 判断是否是闰年。 | ||
LocalTime | now(): 获取当前的时间。 | |
of(int hour, int minute): 根据指定的小时和分钟创建时间。 of(int hour, int minute, int second): 根据指定的小时、分钟和秒创建时间。 | ||
parse() 从字符串解析日期,字符串格式通常为 HH:mm:ss 。 | ||
getHour(): 获取小时。 getMinute(): 获取分钟。 getSecond(): 获取秒。 | ||
plusHours(long hour): 在当前时间上增加指定的小时数。 plusMinutes(long minute): 在当前时间上增加指定的小时数。 plusSeconds(long second): 在当前时间上增加指定的小时数。 | ||
minusHours(long hour): 在当前时间上减去指定的分钟数。 minusMinutes(long minute): 在当前时间上减去指定的分钟数。 minusSecond(long second): 在当前时间上减去指定的分钟数。 | ||
withHour()、withMinute() 修改时间的某个部分。 isBefore() 和 isAfter() 判断某个时间是否早于或晚于另一个时间。 |
LocalDate
LocalDate 表示不含时间的日期,例如 2023-10-05。
常用方法:now():获取当前的日期。
LocalDate today = LocalDate.now();
of(int year, int month, int dayOfMonth):根据指定的年、月、日创建日期。
LocalDate date = LocalDate.of(2023, 10, 5);
getYear():获取年份。
int year = date.getYear();
getMonth():获取月份(返回一个 Month 枚举)。
Month month = date.getMonth();
getDayOfMonth():获取月份中的第几天。
int day = date.getDayOfMonth();
plusDays(long days):在当前日期上增加指定的天数。
LocalDate tomorrow = today.plusDays(1);
minusDays(long days): 在当前日期上减去指定的天数。
LocalDate yesterday = today.minusDays(1);
isLeapYear(): 判断是否是闰年。
boolean leapYear = date.isLeapYear();
常用场景:
- 节假日管理:在系统中管理公共假期或节假日,不需要涉及具体时间。
- 生日或纪念日:记录和计算人的生日、纪念日等。
- 合同开始与结束日期:如合同生效日期、失效日期等。
- 考勤和排班系统:公司员工考勤打卡、排班安排等。
- 产品发布日或截止日:对项目管理中的里程碑进行日期管理。
LocalTime
LocalTime 表示不含日期的时间,例如 14:30:00。
常用方法:
now(): 获取当前的时间。
LocalTime currentTime = LocalTime.now();
of(int hour, int minute): 根据指定的小时和分钟创建时间。
LocalTime time = LocalTime.of(14, 30);
of(int hour, int minute, int second): 根据指定的小时、分钟和秒创建时间。
LocalTime timeWithSeconds = LocalTime.of(14, 30, 45);
getHour(): 获取小时。
int hour = time.getHour();
getMinute(): 获取分钟。
int minute = time.getMinute();
getSecond(): 获取秒。
int second = timeWithSeconds.getSecond();
plusHours(long hours): 在当前时间上增加指定的小时数。
LocalTime later = currentTime.plusHours(2);
minusMinutes(long minutes): 在当前时间上减去指定的分钟数。
LocalTime earlier = currentTime.minusMinutes(30);
LocalDateTime
LocalDateTime 表示日期和时间的组合,例如 2023-10-05T14:30:00。
常用方法:
now(): 获取当前的日期和时间。
LocalDateTime now = LocalDateTime.now();
of(LocalDate date, LocalTime time): 根据指定的日期和时间创建日期时间。
LocalDateTime dateTime = LocalDateTime.of(date, time);
toLocalDate(): 获取日期部分。
LocalDate datePart = dateTime.toLocalDate();
toLocalTime(): 获取时间部分。
LocalTime timePart = dateTime.toLocalTime();
plus(Duration duration): 在当前日期时间上增加指定的持续时间。
LocalDateTime futureTime = now.plus(Duration.ofHours(3));
minus(Duration duration): 在当前日期时间上减去指定的持续时间。
LocalDateTime pastTime = now.minus(Duration.ofMinutes(45));
getYear(), getMonth(), getDayOfMonth(), getHour(), getMinute(), getSecond(): 获取具体的日期和时间字段。
这些类和方法为日期和时间的处理提供了极大的便利,避免了以前使用 java.util.Date 和 java.util.Calendar 时的许多复杂性。
与Date间的转换
LocalDateTime 等类可以通过 Date 转换为 Instant(时间戳),然后再转换为 LocalDateTime。
Date date = Date.from(instant);//Instant转换Date
Instant instant = date.tolnstant();//Date转换Instant
格式化输出
通过 DateTimeFormatter 类进行格式化输出。
- DateTimeFormatter.format():格式化
- DateTimeFormatter.ofPattern():定制格式化
//LoaclDate
LocalDate ld = LocalDate.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
String formattedDate = formatter.format(ld);
System.out.println("格式化后的日期: " + formattedDate);
DateTimeFormatter isoFormatter = DateTimeFormatter.ISO_DATE;
System.out.println("ISO格式化日期: " + isoFormatter.format(ld));
//LoaclTime
LocalTime lt = LocalTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss");
String formattedTime = formatter.format(lt);
System.out.println("格式化后的时间: " + formattedTime);
//LoaclDateTime
LocalDateTime ldt = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formattedDateTime = formatter.format(ldt);
System.out.println("格式化后的日期时间: " + formattedDateTime);
DateTimeFormatter isoFormatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
System.out.println("ISO格式化: " + isoFormatter.format(ldt));
时区处理
在Java中,LocalDateTime 类不直接处理时区,因为它代表的是一个没有时区信息的日期时间值。
要处理时区,你需要使用ZonedDateTime类,它在LocalDateTime的基础上添加了时区信息。
以下是一个简单的例子,展示如何将LocalDateTime转换为特定时区的ZonedDateTime:
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class TimeZoneExample {
public static void main(String[] args) {
// 创建一个LocalDateTime实例
LocalDateTime localDateTime = LocalDateTime.now();
// 获取默认时区
ZoneId defaultZoneId = ZoneId.systemDefault();
// 转换为默认时区的ZonedDateTime
ZonedDateTime zonedDateTimeDefault = localDateTime.atZone(defaultZoneId);
// 输出结果
System.out.println("LocalDateTime: " + localDateTime);
System.out.println("ZonedDateTime in default time zone: " + zonedDateTimeDefault);
// 转换为特定时区的ZonedDateTime
ZoneId zoneId = ZoneId.of("America/New_York");
ZonedDateTime zonedDateTimeNY = localDateTime.atZone(zoneId);
// 输出结果
System.out.println("ZonedDateTime in New York: " + zonedDateTimeNY);
}
}
在这个例子中,我们首先创建了一个 LocalDateTime 对象,然后使用 atZone 方法将其转换为默认时区的 ZonedDateTime 对象。接着,我们使用了 ZoneId.of方法来指定一个特定的时区(例如纽约时区),并再次使用 atZone 方法将 LocalDateTime 转换为这个时区的 ZonedDateTime 对象。最后,我们打印了这两个 ZonedDateTime 对象的值。
更多请参考Java在线中文手册:https://www.matools.com/api/java8