Java中时间类中的Data类与Time类

简介: boolean after(Date date) 若当调用此方法的Date对象在指定日期之后返回true,否则返回false。

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都是线程安全的,并且性能更好,代码更简洁!

相关文章
|
8天前
|
存储 安全 Java
java.util的Collections类
Collections 类位于 java.util 包下,提供了许多有用的对象和方法,来简化java中集合的创建、处理和多线程管理。掌握此类将非常有助于提升开发效率和维护代码的简洁性,同时对于程序的稳定性和安全性有大有帮助。
35 17
|
3天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
28 4
|
4天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
12 2
|
8天前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
|
13天前
|
Java 数据格式 索引
使用 Java 字节码工具检查类文件完整性的原理是什么
Java字节码工具通过解析和分析类文件的字节码,检查其结构和内容是否符合Java虚拟机规范,确保类文件的完整性和合法性,防止恶意代码或损坏的类文件影响程序运行。
|
13天前
|
Java API Maven
如何使用 Java 字节码工具检查类文件的完整性
本文介绍如何利用Java字节码工具来检测类文件的完整性和有效性,确保类文件未被篡改或损坏,适用于开发和维护阶段的代码质量控制。
|
12天前
|
存储 Java 编译器
java wrapper是什么类
【10月更文挑战第16天】
20 3
|
15天前
|
Java 程序员 测试技术
Java|让 JUnit4 测试类自动注入 logger 和被测 Service
本文介绍如何通过自定义 IDEA 的 JUnit4 Test Class 模板,实现生成测试类时自动注入 logger 和被测 Service。
20 5
|
16天前
|
Java
在Java多线程编程中,实现Runnable接口通常优于继承Thread类
【10月更文挑战第20天】在Java多线程编程中,实现Runnable接口通常优于继承Thread类。原因包括:1) Java只支持单继承,实现接口不受此限制;2) Runnable接口便于代码复用和线程池管理;3) 分离任务与线程,提高灵活性。因此,实现Runnable接口是更佳选择。
28 2
|
16天前
|
Java
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
27 2
下一篇
无影云桌面