12 - Java 日期时间( Date、Calenda 、LocalDate、LocalTime、LocalDateTime)

主要介绍了 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();

常用场景:

  1. 节假日管理:在系统中管理公共假期或节假日,不需要涉及具体时间。
  2. 生日或纪念日:记录和计算人的生日、纪念日等。
  3. 合同开始与结束日期:如合同生效日期、失效日期等。
  4. 考勤和排班系统:公司员工考勤打卡、排班安排等。
  5. 产品发布日或截止日:对项目管理中的里程碑进行日期管理。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿垂爱挖掘

谢谢大家的鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值