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

相关文章
|
2月前
|
Java 编译器 API
Java 密封类:精细化控制继承关系
Java 密封类:精细化控制继承关系
261 83
|
3月前
|
IDE Java 数据挖掘
Java 基础类从入门到精通实操指南
这份指南专注于**Java 17+**的新特性和基础类库的现代化用法,涵盖开发环境配置、数据类型增强(如文本块)、字符串与集合处理进阶、异常改进(如密封类)、IO操作及实战案例。通过具体代码示例,如CSV数据分析工具,帮助开发者掌握高效编程技巧。同时提供性能优化建议和常用第三方库推荐,适合从入门到精通的Java学习者。资源链接:[点此下载](https://pan.quark.cn/s/14fcf913bae6)。
169 35
|
4月前
|
存储 安全 Java
【高薪程序员必看】万字长文拆解Java并发编程!(7):不可变类设计指南
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中Java不可变类设计指南,废话不多说让我们直接开始。
68 0
|
11天前
|
安全 IDE Java
Java记录类型(Record):简化数据载体类
Java记录类型(Record):简化数据载体类
88 0
|
2月前
|
Java API
Java API中Math类功能全景扫描
在实际使用时,这些方法的精确度和性能得到了良好的优化。当处理复杂数学运算或高精度计算时,`Math`类通常是足够的。然而,对于非常精细或特殊的数学运算,可能需要考虑使用 `java.math`包中的 `BigDecimal`类或其他专业的数学库。
83 11
|
2月前
|
Java API
深入解析Java API中Object类的功能
了解和合理运用 Object类的这些方法,对于编写可靠和高效的Java应用程序至关重要。它们构成了Java对象行为的基础,影响着对象的创建、识别、表达和并发控制。
50 0
|
2月前
|
安全 Java
JAVA:Collections类的shuffle()方法
`Collections.shuffle()` 是 Java 中用于随机打乱列表顺序的工具方法,适用于洗牌、抽奖等场景。该方法直接修改原列表,支持自定义随机数生成器以实现可重现的打乱顺序。使用时需注意其原地修改特性及非线程安全性。
76 0
|
2月前
|
存储 Java 编译器
深入理解Java虚拟机--类文件结构
本内容介绍了Java虚拟机与Class文件的关系及其内部结构。Class文件是一种与语言无关的二进制格式,包含JVM指令集、符号表等信息。无论使用何种语言,只要能生成符合规范的Class文件,即可在JVM上运行。文章详细解析了Class文件的组成,包括魔数、版本号、常量池、访问标志、类索引、字段表、方法表和属性表等,并说明其在Java编译与运行过程中的作用。
|
2月前
|
SQL Java 数据库连接
Java 期末考试救急必备涵盖绝大多数核心考点及五大类经典代码助你过关
本文为Java期末考试复习指南,涵盖基础语法、面向对象编程、异常处理、文件操作、数据库连接五大核心考点,提供详细解析与实用代码示例,助力快速掌握重点,高效备考,轻松应对考试。
61 0

热门文章

最新文章