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

相关文章
|
7天前
|
Java 编译器
Java——类与对象(继承和多态)
本文介绍了面向对象编程中的继承概念,包括如何避免重复代码、构造方法的调用规则、成员变量的访问以及权限修饰符的使用。文中详细解释了继承与组合的区别,并探讨了多态的概念,包括向上转型、向下转型和方法的重写。此外,还讨论了静态绑定和动态绑定的区别,以及多态带来的优势和弊端。
20 9
Java——类与对象(继承和多态)
|
7天前
|
SQL Java 编译器
Java——类与对象(封装)
封装是面向对象编程中的概念,指将数据(属性)和相关操作(方法)组合成独立单元(类),使外部无法直接访问对象的内部状态,只能通过提供的方法进行交互,从而保护数据安全。例如,手机将各种组件封装起来,只暴露必要的接口供外部使用。实现封装时,使用`private`关键字修饰成员变量,并提供`get`和`set`方法进行访问和修改。此外,介绍了包的概念、导入包的方式及其注意事项,以及`static`关键字的使用,包括静态变量和方法的初始化与代码块的加载顺序。
18 10
Java——类与对象(封装)
|
7天前
|
Java C语言
Java——类与对象
这段内容介绍了Java中的类和对象、`this`关键字及构造方法的基本概念。类是对现实世界事物的抽象描述,包含属性和方法;对象是类的实例,通过`new`关键字创建。`this`关键字用于区分成员变量和局部变量,构造方法用于初始化对象。此外,还介绍了标准JavaBean的要求和生成方法。
18 9
Java——类与对象
|
6天前
|
存储 安全 Java
Java——String类详解
String 是 Java 中的一个类,用于表示字符串,属于引用数据类型。字符串可以通过多种方式定义,如直接赋值、创建对象、传入 char 或 byte 类型数组。直接赋值会将字符串存储在串池中,复用相同的字符串以节省内存。String 类提供了丰富的方法,如比较(equals() 和 compareTo())、查找(charAt() 和 indexOf())、转换(valueOf() 和 format())、拆分(split())和截取(substring())。此外,还介绍了 StringBuilder 和 StringJoiner 类,前者用于高效拼接字符串,后者用于按指定格式拼接字符串
11 1
Java——String类详解
|
8天前
|
存储 Java
Java的对象和类的相同之处和不同之处
在 Java 中,对象和类是面向对象编程的核心。
|
2天前
|
安全 Java
Java StringBuffer 和 StringBuilder 类详解
在 Java 中,`StringBuffer` 和 `StringBuilder` 用于操作可变字符串,支持拼接、插入、删除等功能。两者的主要区别在于线程安全性和性能:`StringBuffer` 线程安全但较慢,适用于多线程环境;`StringBuilder` 非线程安全但更快,适合单线程环境。选择合适的类取决于具体的应用场景和性能需求。通常,在不需要线程安全的情况下,推荐使用 `StringBuilder` 以获得更好的性能。
|
2天前
|
Java 开发者
Java Character 类详解
Java中的`Character`类是`java.lang`包的一部分,用于将基本类型`char`封装为对象,并提供了丰富的静态方法来处理字符,如类型判断、大小写转换等。
|
2天前
|
Java 索引
Java String 类详解
Java 中的 `String` 类用于表示不可变的字符序列,是 Java 标准库 `java.lang` 包的一部分。字符串对象一旦创建,其内容不可更改,修改会生成新对象。
|
6天前
|
Java
Java Character 类详解
`Character` 类是 Java 中的一个封装类,位于 `java.lang` 包中,主要用于处理单个字符。它是一个最终类,提供了多种静态方法来检查和操作字符属性,如判断字符是否为字母、数字或空格,以及转换字符的大小写等。此外,`Character` 类还支持自动装箱和拆箱,简化了 `char` 和 `Character` 之间的转换。以下是一些示例代码,展示了如何使用 `Character` 类的方法来检查字符属性和执行字符转换。掌握 `Character` 类的用法有助于更高效地处理字符数据。
|
6天前
|
Java
Java Number & Math 类详解
在 Java 中,`Number` 类和 `Math` 类是处理数字和数学运算的重要工具。