首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >时间API

时间API

作者头像
晚上没宵夜
发布于 2020-03-10 02:47:38
发布于 2020-03-10 02:47:38
1.7K00
代码可运行
举报
运行总次数:0
代码可运行

1. 时间API

我们的时间在java里是long类型的整数,这个整数称之为时间戳(也叫格林威治时间),即从1970-01-01到现在为止所经过的毫秒数,单有这个时间戳是不能准确表达世界各地的时间,还需加上时区。比如现在输出笔者本地的时间Mon Feb 10 09:48:43 GMT+08:00 2020,其中 GMT+08:00 表示格林威治时间的东8区,也就是北京时间。

2. 旧时间API

java有两套与时间相关的API,分别位于java.util和java.time下,现在更推荐使用time包下的API,由于历史原因,我们还需兼容以前版本的时间函数,所以util也要来学习一下

2.1 Date

Date类内部原理

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private transient long fastTime;

public Date() {
    this(System.currentTimeMillis());
}

public Date(long date) {
    fastTime = date;
}
  • 从变量可以看出java时间戳使用long类型存储
  • 默认构造函数中的System.currentTimeMillis()获取的是当前的时间戳
  • 有参构造说明Date类是依赖时间戳的

从API和JDK可以知道Date内部很多函数都弃用了,打上了@Deprecated标签,旧API中也不推荐使用了,相对推荐使用后面的Calendar类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Deprecated
public Date(int year, int month, int date) {}

@Deprecated
public Date(String s) {}

下面列出常用的方法

类型

函数名

解释

long

getTime

返回Date对象表示的时间戳

int

getYear

返回Date对象表示的年,需+1900

int

getMonth

返回Date对象表示的月,需+1

int

getDate

返回Date对象表示的日

int

getHours

返回Date对象表示的小时

int

getMinutes

返回Date对象表示的分钟

int

getSeconds

返回Date对象表示的秒

int

getDay

返回Date对象表示的周几

例子

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Date date = new Date();
System.out.println(date.getTime());
System.out.println(date.getYear() + 1900);
System.out.println(date.getMonth() + 1);
System.out.println(date.getDate());
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1581301070240
2020
2
10

简单使用时间格式化类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        
System.out.println("简单使用时间格式化类: " + sdf.format(date)); 
System.out.println("原本的输出:" + date);
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
简单使用时间格式化类: 2020-02-10 10:24:13
原本的输出:Mon Feb 10 10:24:13 GMT+08:00 2020

2.2 Calendar

Calendar类比Date多了日期计算功能,还有时区。并且Calendar是抽象类,构造方法为protected即外部包没有继承关系不能访问的,不过他提供了getInstance来获取实例

获取实例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
protected Calendar(){
    // 省略内部如何实现
}

public static Calendar getInstance(){
    // 省略内部如何实现
}

常用方法

类型

函数名

解释

int

get(int field)

返回日历给定字段的值

Date

getTime

返回当前Calendar表示的Date

void

setTimeZone(TimeZone value)

设置时区

void

add(int field, int amount)

当前日历在给定字段上增加给定值

void

setTime(Date date)

将给定Date设置为日历

栗子

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Calendar calendar = Calendar.getInstance();
        
System.out.println(calendar.get(Calendar.YEAR));
System.out.println(calendar.get(Calendar.MONTH) + 1);
System.out.println(calendar.get(Calendar.DATE));

calendar.add(Calendar.YEAR,200);
System.out.println(calendar.get(Calendar.YEAR));

Date date = calendar.getTime();
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2020
2
10
2220

2.3 TimeZone

TimeZone类就是可以设置时区咯

常用方法

类型

函数名

解释

TimeZone

getDefault

返回默认时区

TimeZone

getTimeZone(String ID / zoneId)

返回给定字符串对应的时区

板栗

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Calendar calendar = Calendar.getInstance();
System.out.println(calendar.get(Calendar.HOUR));    // 笔者当前时间11:09
calendar.setTimeZone(TimeZone.getTimeZone("GMT+10:00"));
System.out.println(calendar.get(Calendar.HOUR));    // 东10区时间为01:09
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
11
1

3. java1.8的新时间API

推出新时间API是因为旧API饱受诟病,因为:

  • Date为可变(多线程访问时间会变化)
  • 输出不人性化(Mon Feb 10 10:24:13 GMT+08:00 2020,且从1900开始计算)
  • 格式化类线程不安全(多线程访问格式化不同)

所以新API,java.time包所有类都是不可变和线程安全,且区分日期与时间

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LocalDate date = LocalDate.now();
LocalTime time = LocalTime.now();
LocalDateTime dateTime = LocalDateTime.now();

System.out.println(date);
System.out.println(time);
System.out.println(dateTime);
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2020-02-10
11:39:57.147
2020-02-10T11:39:57.147

输出看起来是不是很舒服,可是LocalDateTime的输出有点懵?,特意找了LocalDateTime的toString方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
public String toString() {
    return date.toString() + 'T' + time.toString();
}

从中可以看出内部是维护了LocalDate和LocalTime了,中间使用了字符 T隔开,为什么不用空格????

3.1 LocalDate

常用方法

类型

函数名

解释

LocalDate

now

返回当前日期

int

getYear

返回年

int

getMonthValue

返回月

int

getDayOfMonth

返回日

LocalDate

of(int year, int month, int dayOfMonth)

创建实例

西瓜

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LocalDate localDate = LocalDate.now();
System.out.println(localDate.getYear());
System.out.println(localDate.getMonthValue());
System.out.println(localDate.getDayOfMonth());
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2020
2
10

3.2 LocalTime

这些其实都差不多就不一一说明了

桃子

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LocalTime localTime = LocalTime.now();
System.out.println(localTime.getHour());
System.out.println(localTime.getMinute());
System.out.println(localTime.getSecond());
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
12
1
18

3.3 LocalDateTime

这里新增了plus和minus方法,对应加减,因为是不可变性,所以和String类一样,返回一个新副本

苹果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime);

LocalDateTime localTime1 = localDateTime.plusYears(1).plusMonths(1).plusDays(1);
System.out.println(localTime1);
        
LocalDateTime localTime2 = localDateTime.minusYears(1).minusMonths(1).minusDays(1);
System.out.println(localTime2);
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2020-02-10T12:07:44.403
2021-03-11T12:07:44.403
2019-01-09T12:07:44.403

3.4 获取时间戳

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Instant timestamp = Instant.now();

3.5 获取时间差

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LocalDateTime startDateTime = LocalDateTime.of(2020, 2, 10, 10, 10, 10);
LocalDateTime endDateTime = LocalDateTime.of(2019, 1, 9, 9, 9, 9);

Duration duration = Duration.between(startDateTime, endDateTime);
System.out.println(duration);
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
PT-9529H-1M-1S      // 相隔9529小时1分1秒
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-02-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
浅谈script标签中的async和defer
浅谈script标签中的async和defer script标签用于加载脚本与执行脚本,在前端开发中可以说是非常重要的标签了。 直接使用script脚本的话,html会按照顺序来加载并执行脚本,在脚本加载&执行的过程中,会阻塞后续的DOM渲染。 现在大家习惯于在页面中引用各种的第三方脚本,如果第三方服务商出现了一些小问题,比如延迟之类的,就会使得页面白屏。 好在script提供了两种方式来解决上述问题,async和defer,这两个属性使得script都不会阻塞DOM的渲
贾顺名
2018/04/12
2.4K0
浅谈script标签中的async和defer
浅谈script标签中的async和defer
现在大家习惯于在页面中引用各种的第三方脚本,如果第三方服务商出现了一些小问题,比如延迟之类的,就会使得页面白屏。 好在script提供了两种方式来解决上述问题,async和defer,这两个属性使得script都不会阻塞DOM的渲染。 但既然会存在两个属性,那么就说明,这两个属性之间肯定是有差异的。
贾顺名
2019/12/05
1.2K0
<script>属性async和defer的区别
async:可选。表示应该立即下载脚本,但不应妨碍页面中的其他操作,比如下载其他资源或 等待加载其他脚本。只对外部脚本文件有效。
TimothyJia
2019/11/12
8470
async 和 defer 的区别
要注意的是,带有 src 的 <script> 元素中不应该再包含额外的代码,如果包含了嵌入的代码,则只会下载外部文件,嵌入的代码不会执行。
李振
2021/11/26
5.4K2
async 和 defer 的区别
Script标签的async和defer
之前有写过HTML页面渲染过程,知道了JavaScript是会阻塞DOM解析的,所以我们会把script标签放到底部防止阻塞HTML解析。其实script还有两个属性,async和defer,也是可以使得JavaScript和DOM和css同步加载。
wade
2020/04/24
7490
你不知道的 script 标签的 defer 与 async 属性
我持续组织了近一年的源码共读活动,感兴趣的可以 点此扫码加我微信 ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列。另外:目前建有江西|湖南|湖北籍前端群,可加我微信进群。
若川
2022/11/11
9600
你不知道的 script 标签的 defer 与 async 属性
再谈DOMContentLoaded与渲染阻塞—分析html页面事件与资源加载
浏览器的多线程中,有的线程负责加载资源,有的线程负责执行脚本,有的线程负责渲染界面,有的线程负责轮询、监听用户事件。
周陆军
2018/05/22
5.4K0
Script 标记的 defer 和 async 属性说明
Script 标记的 defer 和 async 属性可能会显著影响页面加载的性能, 总结说明一下。
beginor
2020/08/07
8830
JS篇(022)-<script>标签的 defer 和 asnyc 属性的作用以及二者的区别?
无论 <script> 标签是嵌入代码还是引用外部文件,只要不包含 defer 属性和 async 属性(这两个属性只对外部文件有效),浏览器会按照 <script> 的出现顺序对他们依次进行解析,也就是说,只有在第一个 <script> 中的代码执行完成之后,浏览器才会执行第二个 <script> 中的代码,并且在解析时,页面的处理会暂时停止。
齐丶先丶森
2022/12/05
9650
JS篇(022)-<script>标签的 defer 和 asnyc 属性的作用以及二者的区别?
高性能Javascript--脚本的无阻塞加载策略
Javascript在浏览器中的性能,可以说是前端开发者所要面对的最重要的可用性问题。 在Yahoo的Yslow23条规则当中,其中一条是将JS放在底部 。原因是,事实上,大多数浏览器使用单进程处理U
Sb_Coco
2018/05/28
1.1K0
JS异步加载的三种方式
同步模式:又称阻塞模式,会阻止浏览器的后续处理,停止后续的解析,只有当当前加载完成,才能进行下一步操作。所以默认同步执行才是安全的。 但这样如果js中有输出document内容、修改dom、重定向等行为,就会造成页面堵塞。所以一般建议把<script>标签放在<body>结尾处,这样尽可能减少页面阻塞。
青梅煮码
2023/01/14
3.6K0
浅析script 标签的 async 和 defer 属性
前端当然要从 HTML 开始,今天来聊聊在 script 标签中加上 async/defer 时的功能及差异。
疯狂的技术宅
2020/11/03
1.3K0
浅析script 标签的 async 和 defer 属性
JavaScript文件加载优化
企鹅号小编
2018/01/04
1.4K0
script 中 defer 和 async 区别
没有 defer 或 async,浏览器会立即加载并执行指定的脚本,“立即”指的是在渲染该 script 标签之下的文档元素之前,也就是说不等待后续载入的文档元素,读到就加载并执行。
用户9914333
2022/07/22
5220
script 中 defer 和 async 区别
Hexo异步加载方案
在博客魔改过程中,不可避免的会引入大量的第三方脚本(js),而基于页面读取js的加载顺序,每当浏览器在加载html的过程中遇到<script>js代码片段</script>这样的标签时,浏览器会暂停继续构建html,而是优先执行当前的js脚本,等执行完毕后再继续加载后面的html。
Akilar
2021/06/11
1.9K0
defer和async的区别
注意:从实用角度来说呢,首先把所有脚本都丢到 </body> 之前是最佳实践,因为对于旧浏览器来说这是唯一的优化选择,此法可保证非脚本的其他一切元素能够以最快的速度得到加载和解析。
老猫-Leo
2023/12/11
2180
defer和async的区别
Js文件异步加载
浏览器中渲染引擎与Js脚本引擎是互斥的,在浏览器开始渲染页面时,如果遇到<script>标签,会停止渲染当前页面,也就是说在脚本加载与执行的过程中会阻塞页面的渲染,在网速较差的环境下可能会出现浏览器页面假死的情况,这也就是尽量将<script>文件放置于<body>后的原因,Js文件异步加载就是使浏览器加载外部Js脚本文件时不阻塞渲染线程,这称为非阻塞模式加载,当然加载完成之后解析执行Js脚本时必须与渲染引擎互斥,解析执行Js脚本的时机取决于异步加载Js的方式。
WindRunnerMax
2020/08/27
11.8K0
在WebKit中并行加载外部脚本译:
作者:Tony Gentilcore 原文:http://webkit.org/blog/1395/running-scripts-in-webkit/ WebKit 正式版已经正式支持HTML5中<script>标签的 async 和 defer 属性了。如此一来,我们就能在不阻塞网页中其它元素下载的情况下,以异步方式下载JavaScript,从而大大提高了网页加载速度。 正常情况下,网页分析器检测到有外部脚本时,会暂停解析,并发起一个请求去下载该脚本,一直到这个脚本完全下载并执行之后解析才会继续进行。
小李刀刀
2018/03/02
2.2K0
script 标签的属性、事件的探究
有 async 没有 defer 时,会与渲染后续文档元素并行加载(加载过程不会阻塞 dom 解析),加载完自动执行(执行会阻塞 dom 解析)
Krry
2018/09/29
2K0
前端 实战项目·动态加载 JS 文件
对于 Vue、React 等框架开发的单页面应用,在某些页面开发特殊功能时经常需要依赖第三方 JS 文件,如果在全局引入 CDN 资源可能会加载冗余文件,此时最好使用动态加载方式。
数媒派
2022/12/01
6K0
相关推荐
浅谈script标签中的async和defer
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档