Java 时间与日期

本文最后更新于: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用法

  • 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);
  • 通过 with 修改某些值。
1
2
3
4
// 修改年为2019
localDateTime = localDateTime.withYear(2020);
// 修改为2022
localDateTime = localDateTime.with(ChronoField.YEAR, 2022);

时间计算

  • 比如有些时候想知道这个月的最后一天是几号,下个周末是几号,通过提供的时间和日期API可以很快得到答案。
1
2
LocalDate localDate = LocalDate.now();
LocalDate localDate1 = localDate.with(firstDayOfYear());
  • 通过firstDayOfYear()返回了当前日期的第一天日期。

格式化时间

  • DateTimeFormatter默认提供了多种格式化方式,如果默认提供的不能满足要求,可以通过DateTimeFormatterofPattern方法创建自定义格式化方式。
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);

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!