Java中时间类中的Data类与Time类
小简博客 - 小简的技术栈,专注Java及其他计算机技术、互联网技术教程 (ideaopen.cn)
Data类
Data类中常用方法
boolean after(Date date) 若当调用此方法的Date对象在指定日期之后返回true,否则返回false。
boolean before(Date date) 若当调用此方法的Date对象在指定日期之前返回true,否则返回false。
Object clone( ) 返回此对象的副本。
int compareTo(Date date) 比较当调用此方法的Date对象和指定日期。两者相等时候返回0。调用对象在指定日期之前则返回负数。调用对象在指定日期之后则返回正数。
int compareTo(Object obj) 若obj是Date类型则操作等同于compareTo(Date) 。否则它抛出ClassCastException。
boolean equals(Object date) 当调用此方法的Date对象和指定日期相等时候返回true,否则返回false。
long getTime( ) 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。
int hashCode( ) 返回此对象的哈希码值。
void setTime(long time) 用自1970年1月1日00:00:00 GMT以后time毫秒数设置时间和日期。
String toString( ) 把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy 其中: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat)。
Date类的使用
package Deta;
import java.time.LocalDate;
import java.util.Date;
public class Test {
public static void main(String[] args) {
//Date
Date date = new Date();
System.out.println(date);
//LocalDate(Time)
LocalDate localDate = LocalDate.now();
System.out.println(localDate);
}
}
我这里为了方便比较,我直接创建了两个对象,一个LocalDate
,一个Date
。
结果如下
Thu Apr 07 16:16:31 CST 2022
2022-04-07
Date
类常用的方法就是上面的几个,所以我这里就不多讲。
Date类关键
但是需要记住以下几点。
Date是比较老的时间类,他是非线程安全的。
LocalDate是Date的一个升级版本。
LocalDate类
上面我们了解了Date
类,我们知道,他是一个比较老的类,且不是线程安全的,所以,我们目前基本上是使用他的升级版LocalDate
。
Java8以前,我们一直长期使用Date
和Calendar
来处理时间,而在使用Date处理日期时间问题上会存在一定的隐患,产生线程不安全的问题,最典型的就是在一定负载并发量的情况下使用SimpleDateFormat
引发的线程安全性问题。
如今Java8提供了
LocalDate
、LocalTime
、LocalDateTime
三个日期时间类,在安全性和操作性上对比Date
和Calendar
非常可观。
所以,这里要记住,LocalDate
、LocalTime
、LocalDateTime
这三个是支持线程安全的。
其次呢,从下面这张图,也就是我们上面运行输出的对比中,可以看出来,Date
类的可读性很差。
这里的三个类,LocalDate
是年月日对象,LocalTime
是时分秒毫秒对象,LocalDateTime
自然就是两者合一了,我们直接采用LocalDateTime
来演示。
package Deta;
import java.time.LocalDateTime;
public class Test {
public static void main(String[] args) {
//创建一个日期对象
LocalDateTime date = LocalDateTime.now();
//获取年份
int year = date.getYear();
//获取月份
int month = date.getMonthValue();
//获取日期
int day = date.getDayOfMonth();
//获取星期
int week = date.getDayOfWeek().getValue();
//获取当前时间
int hour = date.getHour();
int minute = date.getMinute();
int second = date.getSecond();
}
}
这里演示了一些获取日期对象的方法。
我们输出后,是这样的结果。
格式化日期对象
//创建一个日期对象
LocalDateTime date = LocalDateTime.now();
//格式化日期对象
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
我们可以使用DateTimeFormatter
对象来格式化日期的输出格式,yyyy是年MM是月,依此类推,中间的-
可以换成自己想要的字符。
常用方法
然后就是一大堆方法,记住常用就可以。
修改时间方法 |
---|
withDayOfMonth(int dayOfMonth) 返回此日期的副本,并更改日期。 |
withDayOfYear(int dayOfYear) 返回此日期的副本,并更改日期。 |
withMonth(int month) 返回这个日期的副本,并更改年月日。 |
withYear(int year) 返回此日期的副本,并更改年份。 |
返回类型 | 判断分析方法 |
---|---|
boolean |
isAfter(ChronoLocalDate other) 检查此日期是否在指定日期之后。 |
boolean |
isBefore(ChronoLocalDate other) 检查此日期是否在指定日期之前。 |
int |
compareTo(ChronoLocalDate other)` 将此日期与另一个日期进行比较。 |
boolean |
isEqual(ChronoLocalDate other) 检查此日期是否等于指定的日期。 |
boolean |
isLeapYear() 根据ISO培训日历系统规则,检查年份是否是闰年。 |
返回类型 | 方法 |
---|---|
int | lengthOfMonth() 返回由此日期表示的月份的长度。 |
int | lengthOfYear() 返回由此日期表示的年份的长度 |
时间加减操作 |
---|
minusDays(long daysToSubtract) 返回此 LocalDate 的副本,并减去指定的天数。 |
minusMonths(long monthsToSubtract) 返回此 LocalDate 的副本,指定的时间间隔减去。 |
minusWeeks(long weeksToSubtract) 返回此 LocalDate 一个副本,其中指定的周期以周为单位减去。 |
minusYears(long yearsToSubtract) 返回此 LocalDate 的副本,以减去的年份为单位。 |
其他方法 |
---|
plusDays(long daysToAdd) 返回指定天数的 LocalDate 的副本。 |
plusMonths(long monthsToAdd) 返回这个 LocalDate 的副本,其指定的时间段以月为单位。 |
plusWeeks(long weeksToAdd) 返回这个 LocalDate 的副本,并以指定的周期添加周数。 |
plusYears(long yearsToAdd) 返回这个 LocalDate 的副本,其中指定的时间段以添加的年数表示。 |
为啥没要使用新的API
首先啊,上面已经说过了,老版本可读性差劲。
其次呢,我就懒得说了,在网上别人博客里面找到了一个正解,转载来看看。
在java8以前,或许: 当你在做有关时间日期的操作时,你会想到用Date; 当你在做日期、月份、天数相加减时,你会想到用Calendar; 当你需要对时间日期进行格式化时,你会想到使用SimpleDateFormat或DateFormat下的其他子类; …… 但是,你必须知道,以上有关的时间日期操作对象,都是可变的、线程不安全的,同时,如果作为一个经常写过类似代码的人来说,尽管有相关对象提供某些操作,但并不能很快、很简单的就能得到最终想要的结果,如:要计算两个时间点之间相差的年、月、日、周、时、分、秒等,这些计算尽管原有API也能够实现,但原有API除了线程不安全之外,另外一个不足之处就是代码繁琐,性能低!
为何我们总提多线程下,线程不安全?对于初学者来说,可能觉得能够简单实现出功能就已经足够,但是真正的开发项目是不可能仅仅考虑功能的实现的,还要考虑项目的安全性、稳定性、高性能、高可用性等等!因此,作为java开发者,多线程的知识是必不可少的。而也正因为多线程,才会出现一大堆问题(简称线程安全性问题),作为开发者,就应该写出不仅能实现功能的代码,还要是线程安全的代码。那么,学习并熟悉掌握新的线程安全的API就显得非常重要了!
没错,