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以前,我们一直长期使用Date和Calendar来处理时间,而在使用Date处理日期时间问题上会存在一定的隐患,产生线程不安全的问题,最典型的就是在一定负载并发量的情况下使用SimpleDateFormat引发的线程安全性问题。
如今Java8提供了
LocalDate、LocalTime、LocalDateTime三个日期时间类,在安全性和操作性上对比Date和Calendar非常可观。
所以,这里要记住,LocalDate、LocalTime、LocalDateTime这三个是支持线程安全的。
其次呢,从下面这张图,也就是我们上面运行输出的对比中,可以看出来,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类的更多相关文章
- Java日期时间API系列6-----Jdk8中java.time包中的新的日期时间API类
因为Jdk7及以前的日期时间类的不方便使用问题和线程安全问题等问题,2005年,Stephen Colebourne创建了Joda-Time库,作为替代的日期和时间API.Stephen向JCP提交了 ...
- Java日期时间API系列2-----Jdk7及以前的日期时间类在mysql数据库中的应用
1.java中与数据库相关的时间类 java提供与mysql方便交互的三种数据类型: java.sql.Date java.sql.Time java.sql.Timestamp 它们都是继承java ...
- Java日期时间API系列21-----Jdk8中java.time包中的新的日期时间API类,xk-time时间转换,计算,格式化,解析的工具
通过工作之余,对Java8中java.time包源码的不断学习,使用和总结,开发了xk-time,初步完成,欢迎试用和提出建议! xk-time xk-time is a datetime conve ...
- Java日期时间API系列13-----Jdk8中java.time包中的新的日期时间API类,时间类转换,Date转LocalDateTime,LocalDateTime转Date等
从前面的系列博客中可以看出Jdk8中java.time包中的新的日期时间API类设计的很好,但Date由于使用仍非常广泛,这就涉及到Date转LocalDateTime,LocalDateTime转D ...
- Java日期时间API系列19-----Jdk8中java.time包中的新的日期时间API类,ZonedDateTime与ZoneId和LocalDateTime的关系,ZonedDateTime格式化和时区转换等。
通过Java日期时间API系列6-----Jdk8中java.time包中的新的日期时间API类中时间范围示意图:可以很清晰的看出ZonedDateTime相当于LocalDateTime+ZoneI ...
- Java日期时间API系列8-----Jdk8中java.time包中的新的日期时间API类的LocalDate源码分析
目录 0.前言 1.TemporalAccessor源码 2.Temporal源码 3.TemporalAdjuster源码 4.ChronoLocalDate源码 5.LocalDate源码 6.总 ...
- Java日期时间API系列11-----Jdk8中java.time包中的新的日期时间API类,使用java8日期时间API重写农历LunarDate
通过Java日期时间API系列7-----Jdk8中java.time包中的新的日期时间API类的优点,java8具有很多优点,现在网上查到的农历转换工具类都是基于jdk7及以前的类写的,下面使用ja ...
- Java日期时间API系列12-----Jdk8中java.time包中的新的日期时间API类,日期格式化,常用日期格式大全
通过Java日期时间API系列10-----Jdk8中java.time包中的新的日期时间API类的DateTimeFormatter, 可以看出java8的DateTimeFormatter完美解决 ...
- Java日期时间API系列7-----Jdk8中java.time包中的新的日期时间API类的特点
1.不变性 新的日期/时间API中,所有的类都是不可变的,这对多线程环境有好处. 比如:LocalDateTime 2.关注点分离 新的API将人可读的日期时间和机器时间(unix timestamp ...
随机推荐
- SSM(Spring+SpringMVC+MyBatis)框架整合开发流程
回忆了 Spring.SpringMVC.MyBatis 框架整合,完善一个小demo,包括基本的增删改查功能. 开发环境 IDEA MySQL 5.7 Tomcat 9 Maven 3.2.5 需要 ...
- linux下的shell脚本
先说明以下内容来自: http://c.biancheng.net/cpp/shell/ ,C语言中文网,请大家支持原作,点击链接查看. 我写下来只是作为笔记,如果侵权,请留言,立马删除. Shell ...
- SpringAOP--aop使用
SpringAOP使用方式 切点表达式 常用的符号: *:匹配任何数量字符: ..:匹配任何数量字符的重复,如在类型模式中匹配任何数量子包:而在方法参数模式中匹配任何数量参数. +:匹配指定类型的子类 ...
- 为什么要使用 kafka,为什么要使用消息队列?
缓冲和削峰:上游数据时有突发流量,下游可能扛不住,或者下游没有足够多的机器来保证冗余,kafka在中间可以起到一个缓冲的作用,把消息暂存在kafka中,下游服务就可以按照自己的节奏进行慢慢处理. 解耦 ...
- jvm-learning-运行时数据区-整体
在jdk8之后之前的方法区有叫做元数据. 每个JVM只有一个Runtime实例,即为运行时环境,相当于内存结构种的运行时数据区 线程 线程是一个程序里的运行单元,JVM允许一个应用有多个线程并行的执行 ...
- 用 Java 实现阻塞队列 ?
参考 java 中的阻塞队列的内容吧,直接实现有点烦
- 学习heartbeat-04 原理及部署
1. Heartbeat介绍 1.1 Heartbeat作用 通过它可以将资源(IP及程序服务等资源)从一台故障计算机快速转移到另一台运转正常的机器继续提供服务,在实际生产应用场景中,heartbea ...
- 以太网在汽车行业中的挑战——灵活的接口及软件使ECU开发不再复杂
以太网在汽车行业中的挑战--灵活的接口及软件使ECU开发不再复杂 以太网将会在一批新车型中作为一个车载系统网络使用.因此,下一步就是以太网和现有汽车网络技术的集成,包括:CAN.FlexRay.LIN ...
- Python中的numpy库介绍!
转自:https://blog.csdn.net/codedz/article/details/82869370 机器学习算法中大部分都是调用Numpy库来完成基础数值计算的.安装方法: pip3 i ...
- java中StringBuffer的用法
2.StringBuffer StringBuffer:String类同等的类,它允许字符串改变(原因见上一段所说).Overall, this avoids creating many tempor ...