小简博客 - 小简的技术栈,专注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都是线程安全的,并且性能更好,代码更简洁!

Java中时间类中的Data类与Time类的更多相关文章

  1. Java日期时间API系列6-----Jdk8中java.time包中的新的日期时间API类

    因为Jdk7及以前的日期时间类的不方便使用问题和线程安全问题等问题,2005年,Stephen Colebourne创建了Joda-Time库,作为替代的日期和时间API.Stephen向JCP提交了 ...

  2. Java日期时间API系列2-----Jdk7及以前的日期时间类在mysql数据库中的应用

    1.java中与数据库相关的时间类 java提供与mysql方便交互的三种数据类型: java.sql.Date java.sql.Time java.sql.Timestamp 它们都是继承java ...

  3. Java日期时间API系列21-----Jdk8中java.time包中的新的日期时间API类,xk-time时间转换,计算,格式化,解析的工具

    通过工作之余,对Java8中java.time包源码的不断学习,使用和总结,开发了xk-time,初步完成,欢迎试用和提出建议! xk-time xk-time is a datetime conve ...

  4. Java日期时间API系列13-----Jdk8中java.time包中的新的日期时间API类,时间类转换,Date转LocalDateTime,LocalDateTime转Date等

    从前面的系列博客中可以看出Jdk8中java.time包中的新的日期时间API类设计的很好,但Date由于使用仍非常广泛,这就涉及到Date转LocalDateTime,LocalDateTime转D ...

  5. Java日期时间API系列19-----Jdk8中java.time包中的新的日期时间API类,ZonedDateTime与ZoneId和LocalDateTime的关系,ZonedDateTime格式化和时区转换等。

    通过Java日期时间API系列6-----Jdk8中java.time包中的新的日期时间API类中时间范围示意图:可以很清晰的看出ZonedDateTime相当于LocalDateTime+ZoneI ...

  6. Java日期时间API系列8-----Jdk8中java.time包中的新的日期时间API类的LocalDate源码分析

    目录 0.前言 1.TemporalAccessor源码 2.Temporal源码 3.TemporalAdjuster源码 4.ChronoLocalDate源码 5.LocalDate源码 6.总 ...

  7. Java日期时间API系列11-----Jdk8中java.time包中的新的日期时间API类,使用java8日期时间API重写农历LunarDate

    通过Java日期时间API系列7-----Jdk8中java.time包中的新的日期时间API类的优点,java8具有很多优点,现在网上查到的农历转换工具类都是基于jdk7及以前的类写的,下面使用ja ...

  8. Java日期时间API系列12-----Jdk8中java.time包中的新的日期时间API类,日期格式化,常用日期格式大全

    通过Java日期时间API系列10-----Jdk8中java.time包中的新的日期时间API类的DateTimeFormatter, 可以看出java8的DateTimeFormatter完美解决 ...

  9. Java日期时间API系列7-----Jdk8中java.time包中的新的日期时间API类的特点

    1.不变性 新的日期/时间API中,所有的类都是不可变的,这对多线程环境有好处. 比如:LocalDateTime 2.关注点分离 新的API将人可读的日期时间和机器时间(unix timestamp ...

随机推荐

  1. 洛谷 P1020 [NOIP1999 普及组] 导弹拦截

    Coidng #include <iostream> #include <algorithm> #include <cstring> #include <ve ...

  2. Mybatis 的 Xml 映射文件中,不同的 Xml 映射文件,id 是否可以重复?

    不同的 Xml 映射文件,如果配置了 namespace,那么 id 可以重复:如果没有配 置 namespace,那么 id 不能重复: 原因就是 namespace+id 是作为 Map<S ...

  3. 什么是springboot?为什么要用springboot?

    一.什么是springboot? Springboot是spring发展到一定程度的产物,但并不是spring的替代品,springboot是为了让程序员更好的使用spring.Spring随着发展逐 ...

  4. 简述 Mybatis 的插件运行原理,以及如何编写一个插件?

    Mybatis 仅可以编写针对 ParameterHandler.ResultSetHandler. StatementHandler.Executor 这 4 种接口的插件,Mybatis 使用 J ...

  5. 简述 synchronized 和 java.util.concurrent.locks.Lock 的异同?

    Lock 是 Java 5 以后引入的新的 API,和关键字 synchronized 相比主要相同点: Lock 能完成 synchronized 所实现的所有功能:主要不同点:Lock 有比 sy ...

  6. MyISAM 表格将在哪里存储,并且还提供其存储格式?

    每个 MyISAM 表格以三种格式存储在磁盘上: ·".frm"文件存储表定义 ·数据文件具有".MYD"(MYData)扩展名 索引文件具有".MY ...

  7. OOP 中的 组合、聚合和关联有什么区别?

    如果两个对象彼此有关系,就说他们是彼此相关联的.组合和聚合是面向对象中 的两种形式的关联.组合是一种比聚合更强力的关联.组合中,一个对象是另一 个的拥有者,而聚合则是指一个对象使用另一个对象.如果对象 ...

  8. 在多线程环境下,SimpleDateFormat 是线程安全的吗?

    不是,非常不幸,DateFormat 的所有实现,包括 SimpleDateFormat 都不是 线程安全的,因此你不应该在多线程序中使用,除非是在对外线程安全的环境中 使用,如 将 SimpleDa ...

  9. 学习ELK日志平台(五)

    ELK Stack 通常情况下: 1,开发人员是不能登录线上服务器查看日志信息 2,各个系统的日志繁多,日志数据分散难以查找 3,日志数据量较大,查询速度慢,数据不够实时性 4,一个调用会涉及到多个系 ...

  10. input 输入框只能输入数字,一行代码解决,兼容谷歌 火狐

    <input id="mobile" name="mobile" type="text" onkeyup="this.val ...