时间相关的类
java.time包中提供了处理时间的类(早期java.util包中的Date类已经过期)
LocalDate、LocalDateTime和LocalTime类的对象封装了时间相关的数据,这3个类都是final类,且没有修改数据的方法,实体无法改变。
println()打印的是这三个类的对象的实体,不是引用
LocalDate类
调用类方法**LocalDate now()**可以返回LocalDate对象,封装了现在的时间数据。
调用类方法LocalDate of(int year ,int month,int dayOfMonth),返回的对象封装了参数指定的时间数据。
例子:
LocalDate dateNow=LocalDate.now();
LocalDate dateOther=LocalDate.of(1988,12,16)
LocalDate类的对象可以调用以下方法返回相关数据
int getDayOfMonth()
:返回这个月的第几号(日)int getMonthValue()
:返回第几个月(1-12)Month getMonth()
:返回第几个月 的枚举值(Month是枚举类型)。如:FEBRUARYint getDayOfYear()
:返回当前年中的第几天,(1-366)DayOfWeek getDayOfWeek()
:返回星期几的枚举值,如:SUNDAY、MONDAY。int getYear()
:返回第几年int lengthOfYear()
:返回该年所含天数,365或366int lengthOfMonth()
:返回月含有的天数,28-31boolean isLeapYear()
:判断是否为闰年LocalDate plusMonths(long monthsToAdd)
返回一个行动LocalDate对象,新对象日期是该对象日期增加monthToAdd月之后得到的日期(该参数可以取负值)- plusDays()、plusYears()、plusWeeks()和上面作用相似
int compareTo(LocalDate dataTwo)
:该对象和dataTwo比较,规则按年、月、日的顺序比较,某项不同时返回两者的差。返回值是正数时说明该时间比dataTwo时间晚(最多精确到日)。- long until(Temporal endExclusive,TemporalUnit unit);计算日期差,后面有详细介绍
LocalDateTime
相对于LocalDate类,该类的对象还可以封装时、分、秒和纳秒(一纳秒是1秒的10亿分之一)等时间数据。
该类同样可以使用LocalDateTime now()和of()返回一个对象,如:
LocalDateTime date=LocalDateTime.now():
LocalDateTime date1=LocalDate.of(1988,12,16,22,35,55,0);
LocalDateTime of(int year,int month,int dayOfMonth,int hour,int minute,int second,int nanoOfSecond),封装了年、月、日、时、分、秒、纳秒,随然没有输入星期,但是该对象仍然封装了星期几和该年总天数等。
LocalDateTime类的方法
-
int getHour()
:返回第几小时(0-23) -
int getMinute()
:返回第几分钟(0-59) -
int getSecond()
:返回第几秒(0-59) -
int getNano()
:返回第几纳秒(0-999999999) -
上述LocalDate类的所有getXXX方法
-
plusHours()、plusSeconds()···类似与LocalDate的puls方法,可以加时分秒和纳秒,同时拥有LocalDate原本的puls方法(加天数、月数等)
-
int compareTo(LocalDatetime dataTwo)
:和LocalDate的方法类似 -
long until(Temporal endExclusive,TemporalUnit unit);计算日期差,后面有详细介绍
-
LocalDate toLocalDate()
:将自己转化为LocalDate对象,这样转化后得到的对象,就可以使用LocalDate对象可以使用的所有方法了。例如:System.out.println(data.toLocalDate().lengthOfYear())//返回该年的总天数
LocalTime
相对于LocalDateTime类的对象,LocalTime只封装时、分、秒和纳秒等时间数据。
方法
- 它的返回时分秒和纳秒的方法和LocalDateTime相同
- 和两者类似的plus方法,只有加时、分、秒、纳秒的,名称和LocalDateTime的相同
int compareTo(Localtime dataTwo)
:和LocalDate的方法类似- long until(Temporal endExclusive,TemporalUnit unit);计算日期差,后面有详细介绍
- 没有toLocalDate()方法
计算日期差的方法long until()
long until(Temporal endExclusive,TemporalUnit unit); 其中endExclusive是一个时间类对象,unit则决定计算时间差的方式
LocalDate、LocalDateTime和LocalTime都实现了Temporal接口,所以都可以使用这个方法。
枚举类型ChronoUnit实现了TemporalUnit接口,提供了许多枚举常量,如:YEARS、MONTHS、DAYS、HOURS、MINUTES、SECONDS、NANOS、WEEKS。
示例:假设dataStar的日期是2021-2-4,dateEnd的日期是2022-7-9,那么
dateStart.until(dateEnd,ChronoUnit.DAYS);//其值为520,天数差
dateStart.until(dateEnd,ChronoUnit.MONTHS);//其值为17,月数差
dateStart.until(dateEnd,ChronoUnit.YEARS);//其值为17,月数差
如果dateEnd小于startDate,until方法返回的是负数。在计算日期差时,不足一个单位的零头按照0计算。
时间格式化
定义:希望时间信息按照特定模式输出
format()方法(属于String的一个类方法)
String format(格式化模式,时间数据列表);
该方法返回一个String对象,其实体是“时间数据列表”按照"格式化模式"排列的字符序列。
”格式化模式“是一个用双引号括起来的字符序列,该字符序列中的字符由时间格式符和普通字符所构成。例如:
"日期:%ty-%tm-%td"
-
时间格式符是一种代表指定格式的某种时间信息的符号,如:“%ty”、“%tm”。其中"%tm"就是代表二位形式的几月,如;01、02、03……11、12
-
普通字符指时间格式符除外的所有字符,如:“日”、“期”、“:”、“-”。这些字符虽然和日期的表达有关,如”日“和”期“两个字,但是却并没有具体的时间信息(如:1月2日,包含了具体信息)。这种不包含具体时间信息的字符就是普通字符。
示例:
LocalDate date=LocalDate.now(); String s=String.format("%tY年%tm月%td日",date,date,date);
假设当前日期是2024-5-12,那么s的实体就是"2024年05月12日"
注意
要保证,format()方法中”格式化模式“中的时间格式符的个数与”日期列表“中列出的日期个数相同。可以像例子中一样,使用逗号分隔的LocalDate对象,默认按照从左到右,使用“格式化模式”中的时间格式符来格式化“日期列表”中对应的时间对象,而普通字符保留原样。
如果希望多个时间格式符的数据都从一个时间对象中获得,可以在“格式化模式”中使用"<“,比如,”%ty-%<tm-%<td"中的3个时间格式符将会格式化同一个日期,即含有"<"的格式符将会和它前面的时间格式符一起格式化同一个日期。
String s=String.format("%ty年%<tm月%<td日",date);
//这样三个时间格式符就可以使用一个时间对象了
时间格式符
常用时间格式符 | 含义 |
---|---|
%tY | 4位形式的第几年,如1999、0012、2021(带前导零) |
%ty | 两位形式的第几年,如99、02(带前导零) |
%tm | 两位形式的第几月,如01、11(带前导零) |
%td | 两位形式的当月的第几天,01-31(带前导零) |
%tB | 当前环境下的第几月的全称,如US环境下,“January” |
%tb | 当前环境下的第几月的简称,如US环境下,“Jan”、“Feb” |
%tA | 当前环境下的星期几的全称,如"Sunday" |
%ta | 当前环境下的星期几的简称,如"Sun"、“Mon” |
%tH | 两位形式,24小时制的第几小时,00-23(带前导零) |
%tI | 两位形式,12小时制的第几小时,1-12 |
%tM | 两位形式的第几分钟,00-60(带前导零) |
%tS | 两位形式的第几秒,00-60(带前导零) |
%tN | 九位形式的第几纳秒,000000000-999999999(带前导零) |
%tp | 当前地区的时间是上午还是下午,如在中国," 上午" |
特殊时间格式符 | 代表几个日期格式符组合在一起 |
%tR | 等价于 %tH:%tM |
%tT | 等价于 %tH:%tM:%S |
%tr | 等价于 %tI:%tM:%tS%tp(%tp的表达形式与地区有关) |
%tD | 等价于 %tm/%td/%ty |
%tF | 等价于 “%tY-%tm-%td” |
%tc | 等价于 “%ta %tb %td %tT %tZ %tY” ("%tZ"好像不是时间格式符,会报错) |
获取特定地区的星期格式
不同区域的星期表示方法不同。如,星期四在美国用Thu(Thursday)作为简称(全称),在日本用”木“(木曜日)作为简称(全称)。
可以使用format()方法的一个重载方法,指定特定地区的星期格式
String format(Locale locale,格式化模式,日期列表);
locale是Locale类的对象,用于表示地域。
Locale类的Static常量都是Locale对象。如:Locale.US表示美国,(US就是Locale的一个Static常量)Locale.JAPAN表示日本。
String s=String.format(Locale.US,"%tA",date);
//若date中的数据是星期四,那么s="Thursday"
如果不设置特定地区,那么locale会读取系统的地区设置。如在中国,locale=Locale.CHINA
创作不易,各位看官点赞支持一下吧