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以前,我们一直长期使用DateCalendar来处理时间,而在使用Date处理日期时间问题上会存在一定的隐患,产生线程不安全的问题,最典型的就是在一定负载并发量的情况下使用SimpleDateFormat引发的线程安全性问题

如今Java8提供了LocalDateLocalTimeLocalDateTime三个日期时间类,在安全性和操作性上对比DateCalendar非常可观。

所以,这里要记住,LocalDateLocalTimeLocalDateTime这三个是支持线程安全的。

其次呢,从下面这张图,也就是我们上面运行输出的对比中,可以看出来,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就显得非常重要了!

没错,java8出的新的时间日期API都是线程安全的,并且性能更好,代码更简洁!

posted @ 2022-04-08 09:01  JanYork(小简)  阅读(205)  评论(0编辑  收藏  举报