本文最后更新于:2024年3月18日 凌晨
Java 时间与日期
Date类
在Java中日期用代表毫微秒的一个长整数进行存储表示,也就是日期时间相对格林威治时间(GMT)1970年1月1日零点整过去的毫微秒数,日期的构造方法如下:
Date()
:创建一个代表当前时间的日期对象。
Date(long date)
:根据毫微秒值创建日期对象。
执行日期对象的toString()
方法将按星期,月,日,小时,分,秒,年的默认顺序输出相关信息,例如Sun Oct 31 16:28:04 CST 2004
将当前日期与某个日期比较可使用int compareTo(Date anotherDate)
方法,结果为0代表相等,为负数代表日期对象比参数代表的日期要早,为正数则代表日期对象比参数代表的日期要晚。
另外,用getTime()
方法可得到日期对象对应的毫微秒值。
一旦您有一个可用的 Date 对象,您可以调用下列任意支持的方法来使用日期:
序号
方法 & 描述
1
boolean after(Date date) 如果调用的 Date 对象中包含的日期在 date 指定的日期之后,则返回 true,否则返回 false
2
boolean before(Date date) 如果调用的 Date 对象中包含的日期在 date 指定的日期之前,则返回 true,否则返回 false
3
Object clone( ) 重复调用 Date 对象
4
int compareTo(Date date) 把调用对象的值与 date 的值进行比较,如果两个值是相等的,则返回 0,如果调用对象在 date 之前,则返回一个负值,如果调用对象在 date 之后,则返回一个正值
5
int compareTo(Object obj) 如果 obj 是 Date 类,则操作等同于 compareTo(Date),否则,它会抛出一个 ClassCastException
6
boolean equals(Object date) 如果调用的 Date 对象中包含的时间和日期与 date 指定的相同,则返回 true,否则返回 false
7
long getTime( ) 返回 1970 年 1 月 1 日以来经过的毫秒数
8
int hashCode( ) 为调用对象返回Hash值
9
void setTime(long time) 设置 time 指定的时间和日期,这表示从 1970 年 1 月 1 日午夜以来经过的时间(以毫秒为单位)
10
String toString( ) 转换调用的 Date 对象为一个字符串,并返回结果
日期比较
您可以使用 getTime()
来获取两个对象自 1970 年 1 月 1 日午夜以来经过的时间(以毫秒为单位),然后对这两个值进行比较。
您可以使用方法 before( )
,after( )
和 equals( )
,由于一个月里 12 号在 18 号之前,例如,new Date(99, 2, 12).before(new Date (99, 2, 18))
返回 true
您可以使用 compareTo( )
方法,该方法由 Comparable 接口定义,由 Date 实现。
Calendar类
Calendar类主要用于日期与年,月,日等整数值的转换,Calendar是一个抽象类,不能直接创建对象,但可以使用静态方法getInstance()
获得代表当前日期的日历对象。
1 Calendar rightNow = Calendar.getInstance();
通过该对象可以调用如下方法将日历翻到指定的一个时间:
void set(int year,int mouth,int date)
``void set(int year,int mouth,int date,int hour,int minute)`
void set(int year,int mouth,int date,int hour,int minute,int second)
要从日历中获取有关年份,月份,星期,小时等的信息,可以通过int get(int field)
方法得到,其中参数field的值由Calendar类的静态常量决定,例如,YEAR
代表年,MOUTH
代表月,DAY_OF_WEEK
代表星期几,HOUR
代表小时,MINUTE
代表分,SECOND
代表秒,AM_PM
代表AM或PM,例如:
1 rightNow.get(Calendar.MONTH)
注意 :如果返回值为0代表当前日历是一月份,如果返回1代表二月份,依此类推。
将当前日期拼接为字符串可用如下代码:
1 String mydate = rightNow.get(Calendar.YEAR)+"-" +(rightNow.get(Calendar.MONTH)+1 )+"-" +rightNow.get(Calendar.DATE);
通过以下方法可获取日历对象的其他时间表示形式:
long getTimeInMillis()
:返回当前日历对应的毫微秒值。
Date getTime()
:返回当前日历对应的日期对象。
SimpleDateFormat是Java提供的一个格式化和解析日期的工具类。
Date 转 String
在Java中,可以使用SimpleDateFormat的format方法,将一个Date类型转化成String类型,并且可以指定输出格式。
1 2 3 4 Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss" ); String dateStr = sdf.format(date); System.out.println(dateStr);
以上代码,转换的结果是:2018-11-25 13:00:00,日期和时间格式由”日期和时间模式”字符串指定,如果你想要转换成其他格式,只要指定不同的时间模式就行了。
String 转Date
在Java中,可以使用SimpleDateFormat的parse方法,将一个String类型转化成Date类型。
1 2 3 String dateStr = "2020-10-10 10:10:10" ; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss" ); System.out.println(sdf.parse(dataStr));
设置时间区域
1 2 3 4 5 Date date = new Date(); SimpleDateFormat Shanghai = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss" ); Shanghai.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai" )); String dateStr = Shanghai.format(date); System.out.println(dateStr);
常见的地区格式
代码
地区
Asia/Shanghai
亚洲/上海
Australia/Sydney
澳大利亚/悉尼
America/New_York
美洲/纽约
Asia/Tokyo
亚洲/日本
Europe/London
欧洲/伦敦
简单的日期格式的格式代码
使用事件模式字符串来指定时间格式,在这种模式下,所有的 ASCII 字母被保留为模式字母,这些字母定义如下:
字符
描述
实例
G
Era 指示器
AD
y
四位数表示的年
2001
M
一年中的月
July 或 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
’
Escape for text
Delimiter
"
单引号
`
LocalDate,LocalTime,LocalDateTime,Instant
LocalDate
创建 LocalDate
1 2 3 4 LocalDate localDate = LocalDate.now(); LocalDate localDate1 = LocalDate.of(2019 , 9 , 10 );
获取年月日星期
1 2 3 4 5 6 7 8 int year = localDate.getYear();int year1 = localDate.get(ChronoField.YEAR); Month month = localDate.getMonth();int month1 = localDate.get(ChronoField.MONTH_OF_YEAR);int day = localDate.getDayOfMonth();int day1 = localDate.get(ChronoField.DAY_OF_MONTH); DayOfWeek dayOfWeek = localDate.getDayOfWeek();int dayOfWeek1 = localDate.get(ChronoField.DAY_OF_WEEK);
LocalTime
创建 LocalTime
1 2 LocalTime localTime = LocalTime.of(13 , 51 , 10 ); LocalTime localTime1 = LocalTime.now();
获取时分秒
1 2 3 4 5 6 7 8 9 int hour = localTime.getHour();int hour1 = localTime.get(ChronoField.HOUR_OF_DAY);int minute = localTime.getMinute();int minute1 = localTime.get(ChronoField.MINUTE_OF_HOUR);int second = localTime.getSecond();int second1 = localTime.get(ChronoField.SECOND_OF_MINUTE);
LocalDateTime
获取年月日时分秒,等于LocalDate+LocalTime
创建 LocalDateTime
1 2 3 4 5 LocalDateTime localDateTime = LocalDateTime.now(); LocalDateTime localDateTime1 = LocalDateTime.of(2019 , Month.SEPTEMBER, 10 , 14 , 46 , 56 ); LocalDateTime localDateTime2 = LocalDateTime.of(localDate, localTime); LocalDateTime localDateTime3 = localDate.atTime(localTime); LocalDateTime localDateTime4 = localTime.atDate(localDate);
获取 LocalDate
1 LocalDate localDate2 = localDateTime.toLocalDate();
获取 LocalTime
1 LocalTime localTime2 = localDateTime.toLocalTime();
Instant
创建 Instant
1 Instant instant = Instant.now();
获取秒数
1 long currentSecond = instant.getEpochSecond();
获取毫秒数
1 long currentMilli = instant.toEpochMilli();
修改LocalDate,LocalTime,LocalDateTime,Instant
LocalDate
,LocalTime
,LocalDateTime
,Instant
为不可变对象 ,修改这些对象对象会返回一个副本
增加,减少年数,月数,天数等以LocalDateTime为例。
1 2 3 4 5 6 7 LocalDateTime localDateTime = LocalDateTime.of(2019 , Month.SEPTEMBER, 10 , 14 , 46 , 56 ); localDateTime = localDateTime.plusYears(1 ); localDateTime = localDateTime.plus(1 , ChronoUnit.YEARS); localDateTime = localDateTime.minusMonths(1 ); localDateTime = localDateTime.minus(1 , ChronoUnit.MONTHS);
1 2 3 4 localDateTime = localDateTime.withYear(2020 ); localDateTime = localDateTime.with(ChronoField.YEAR, 2022 );
时间计算
比如有些时候想知道这个月的最后一天是几号,下个周末是几号,通过提供的时间和日期API可以很快得到答案。
1 2 LocalDate localDate = LocalDate . now() ; LocalDate localDate1 = localDate.with (firstDayOfYear() );
通过firstDayOfYear()
返回了当前日期的第一天日期。
格式化时间
DateTimeFormatter
默认提供了多种格式化方式,如果默认提供的不能满足要求,可以通过DateTimeFormatter
的ofPattern
方法创建自定义格式化方式。
1 2 3 4 5 6 LocalDate localDate = LocalDate.of(2019 , 9 , 10 ); String s1 = localDate.format(DateTimeFormatter.BASIC_ISO_DATE); String s2 = localDate.format(DateTimeFormatter.ISO_LOCAL_DATE); DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy" ); String s3 = localDate.format(dateTimeFormatter);
解析时间
1 2 LocalDate localDate1 = LocalDate.parse("20190910" , DateTimeFormatter.BASIC_ISO_DATE); LocalDate localDate2 = LocalDate.parse("2019-09-10" ,DateTimeFormatter.ISO_LOCAL_DATE);