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 ...
随机推荐
- 洛谷 P1020 [NOIP1999 普及组] 导弹拦截
Coidng #include <iostream> #include <algorithm> #include <cstring> #include <ve ...
- Mybatis 的 Xml 映射文件中,不同的 Xml 映射文件,id 是否可以重复?
不同的 Xml 映射文件,如果配置了 namespace,那么 id 可以重复:如果没有配 置 namespace,那么 id 不能重复: 原因就是 namespace+id 是作为 Map<S ...
- 什么是springboot?为什么要用springboot?
一.什么是springboot? Springboot是spring发展到一定程度的产物,但并不是spring的替代品,springboot是为了让程序员更好的使用spring.Spring随着发展逐 ...
- 简述 Mybatis 的插件运行原理,以及如何编写一个插件?
Mybatis 仅可以编写针对 ParameterHandler.ResultSetHandler. StatementHandler.Executor 这 4 种接口的插件,Mybatis 使用 J ...
- 简述 synchronized 和 java.util.concurrent.locks.Lock 的异同?
Lock 是 Java 5 以后引入的新的 API,和关键字 synchronized 相比主要相同点: Lock 能完成 synchronized 所实现的所有功能:主要不同点:Lock 有比 sy ...
- MyISAM 表格将在哪里存储,并且还提供其存储格式?
每个 MyISAM 表格以三种格式存储在磁盘上: ·".frm"文件存储表定义 ·数据文件具有".MYD"(MYData)扩展名 索引文件具有".MY ...
- OOP 中的 组合、聚合和关联有什么区别?
如果两个对象彼此有关系,就说他们是彼此相关联的.组合和聚合是面向对象中 的两种形式的关联.组合是一种比聚合更强力的关联.组合中,一个对象是另一 个的拥有者,而聚合则是指一个对象使用另一个对象.如果对象 ...
- 在多线程环境下,SimpleDateFormat 是线程安全的吗?
不是,非常不幸,DateFormat 的所有实现,包括 SimpleDateFormat 都不是 线程安全的,因此你不应该在多线程序中使用,除非是在对外线程安全的环境中 使用,如 将 SimpleDa ...
- 学习ELK日志平台(五)
ELK Stack 通常情况下: 1,开发人员是不能登录线上服务器查看日志信息 2,各个系统的日志繁多,日志数据分散难以查找 3,日志数据量较大,查询速度慢,数据不够实时性 4,一个调用会涉及到多个系 ...
- input 输入框只能输入数字,一行代码解决,兼容谷歌 火狐
<input id="mobile" name="mobile" type="text" onkeyup="this.val ...