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 ...
随机推荐
- 利用多个sem信号量在线程通讯
直接上代码,主要用到sem_trywait & sem_post #include<stdio.h> #include<pthread.h> #include<s ...
- KestrelServer详解[2]: 网络链接的创建
<注册监听终结点(Endpoint)>已经详细讲述了如何使用KestrelServer,现在我们来简单聊聊这种处理器的总体设计和实现原理.当KestrelServer启动的时候,注册的每个 ...
- 简单 Linux 文件系统?
在 Linux 操作系统中,所有被操作系统管理的资源,例如网络接口卡.磁盘驱动器.打印机.输入输出设备.普通文件或是目录都被看作是一个文件.也就是说在 Linux 系统中有一个重要的概念**:一切都是 ...
- windows 访问 CentOS 的防火墙及其 网关开放
1.防火墙开放端口 firewall-cmd --zone=public --add-port=8848/tcp --permanent firewall-cmd --list-ports 开放cen ...
- 最长公共子序列(LCS动态规划)?
// dp[i][j] 计算去最大长度,记住口诀:相等左上角加一,不等取上或左最大值function LCS(str1, str2){ var rows = str1.split(&q ...
- Dubbo 和 Dubbox 之间的区别?
Dubbox 是继 Dubbo 停止维护后,当当网基于 Dubbo 做的一个扩展项目,如 加了服务可 Restful 调用,更新了开源组件等.
- kafka 如何不消费重复数据?比如扣款,我们不能重复的扣?
其实还是得结合业务来思考,我这里给几个思路: 比如你拿个数据要写库,你先根据主键查一下,如果这数据都有了,你就别插入 了,update 一下好吧. 比如你是写 Redis,那没问题了,反正每次都是 s ...
- IDEA 创建javaWeb以及Servlet
1.新建项目 2.Web工程设置:点击项目名称,按F4 (1)配置sources:在WEB-INF下新建两个文件夹classes和lib (2)配置path:刚刚创建的classes文件夹路径 (3) ...
- hdu 1175 连连看 DFS_字节跳动笔试原题
转载至:https://www.cnblogs.com/LQBZ/p/4253962.html Problem Description "连连看"相信很多人都玩过.没玩过也没关系, ...
- spring 自动装配 bean 有哪些方式?
Spring容器负责创建应用程序中的bean同时通过ID来协调这些对象之间的关系.作为开发人员,我们需要告诉Spring要创建哪些bean并且如何将其装配到一起. spring中bean装配有两种方式 ...