时间API
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类内部原理
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类

@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对象表示的周几 |
例子
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());
1581301070240
2020
2
10
简单使用时间格式化类
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("简单使用时间格式化类: " + sdf.format(date));
System.out.println("原本的输出:" + date);
简单使用时间格式化类: 2020-02-10 10:24:13
原本的输出:Mon Feb 10 10:24:13 GMT+08:00 2020
2.2 Calendar
Calendar类比Date多了日期计算功能,还有时区。并且Calendar是抽象类,构造方法为protected即外部包没有继承关系不能访问的,不过他提供了getInstance来获取实例
获取实例
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设置为日历 |
栗子
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();
2020
2
10
2220
2.3 TimeZone
TimeZone类就是可以设置时区咯
常用方法
| 类型 | 函数名 | 解释 |
|---|---|---|
| TimeZone | getDefault | 返回默认时区 |
| TimeZone | getTimeZone(String ID / zoneId) | 返回给定字符串对应的时区 |
板栗
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
11
1
3. java1.8的新时间API
推出新时间API是因为旧API饱受诟病,因为:
- Date为可变(多线程访问时间会变化)
- 输出不人性化(Mon Feb 10 10:24:13 GMT+08:00 2020,且从1900开始计算)
- 格式化类线程不安全(多线程访问格式化不同)
所以新API,java.time包所有类都是不可变和线程安全,且区分日期与时间
LocalDate date = LocalDate.now();
LocalTime time = LocalTime.now();
LocalDateTime dateTime = LocalDateTime.now();
System.out.println(date);
System.out.println(time);
System.out.println(dateTime);
2020-02-10
11:39:57.147
2020-02-10T11:39:57.147
输出看起来是不是很舒服,可是LocalDateTime的输出有点懵?,特意找了LocalDateTime的toString方法
@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) | 创建实例 |
西瓜
LocalDate localDate = LocalDate.now();
System.out.println(localDate.getYear());
System.out.println(localDate.getMonthValue());
System.out.println(localDate.getDayOfMonth());
2020
2
10
3.2 LocalTime
这些其实都差不多就不一一说明了
桃子
LocalTime localTime = LocalTime.now();
System.out.println(localTime.getHour());
System.out.println(localTime.getMinute());
System.out.println(localTime.getSecond());
12
1
18
3.3 LocalDateTime
这里新增了plus和minus方法,对应加减,因为是不可变性,所以和String类一样,返回一个新副本
苹果
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);
2020-02-10T12:07:44.403
2021-03-11T12:07:44.403
2019-01-09T12:07:44.403
3.4 获取时间戳
Instant timestamp = Instant.now();
3.5 获取时间差
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);
PT-9529H-1M-1S // 相隔9529小时1分1秒
时间API的更多相关文章
- Java8 时间 API
前言 Java8 中最为人津津乐道的新改变恐怕当属函数式 API 的加入.但实际上,Java8 所加入的新功能远不止这个. 本文将基于<Java SE8 for the Really Impat ...
- 计算机程序的思维逻辑 (95) - Java 8的日期和时间API
本节继续探讨Java 8的新特性,主要是介绍Java 8对日期和时间API的增强,关于日期和时间,我们在之前已经介绍过两节了,32节介绍了Java 1.8以前的日期和时间API,主要的类是Date和 ...
- Java 8 日期时间 API
转自:https://www.runoob.com/java/java8-datetime-api.html Java 8通过发布新的Date-Time API (JSR 310)来进一步加强对日期与 ...
- JDK8 新增的日期时间API
背景 JDK8中增加了一套全新的日期时间API,这里进行总结下,方便查询使用. 新的时间及日期API位于 java.time 包中,下面是一些关键类. Instant:代表的是时间戳. LocalDa ...
- Java 8 (二) 新的时间API
新的时间API 一)时间线 Instant对象:表示时间轴上的一个点,原点为1970-1-1的午夜. Duration对象:表示一段时间. 注意Instant和Duration类都是final. 二) ...
- Java编程的逻辑 (95) - Java 8的日期和时间API
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...
- Java 8 新特性-菜鸟教程 (8) -Java 8 日期时间 API
Java 8 日期时间 API Java 8通过发布新的Date-Time API (JSR 310)来进一步加强对日期与时间的处理. 在旧版的 Java 中,日期时间 API 存在诸多问题,其中有: ...
- JDK8中的时间API
在Java 1.0中,对日期和时间的支持只能依赖java.util.Date类.正如类名所表达的,这个类无法表示日期,只能以毫秒的精度表示时间.更糟糕的是它的易用性,由于某些原因未知的设计决策,这个类 ...
- Java 8 新日期时间 API
Java 8 新日期时间 API 1. LocalDate.LocalTime.LocalDateTime LocalDate.LocalTime.LocalDateTime 实例是不可变的对象,分别 ...
- Java 8 日期时间API使用介绍
如何正确处理时间 现实生活的世界里,时间是不断向前的,如果向前追溯时间的起点,可能是宇宙出生时,又或是是宇宙出现之前, 但肯定是我们目前无法找到的,我们不知道现在距离时间原点的精确距离.所以我们要表示 ...
随机推荐
- UVA - 11400 Lighting System Design(照明系统设计)(dp)
题意:共有n种(n<=1000)种灯泡,每种灯泡用4个数值表示.电压V(V<=132000),电源费用K(K<=1000),每个灯泡的费用C(C<=10)和所需灯泡的数量L(1 ...
- css设置兄弟节点的样式(相邻的前一个节点)
产品需求:想在鼠标移动到“移除”的时候,“1.产品匹配测试”添加下划线和更改字体颜色 需求分析:从需求可以看出使用 :hover 就可以解决的问题,但是在实践中发现兄弟选择器(+)不好使,(+)只能是 ...
- 51nod 1287: 加农炮 好题啊好题
1287 加农炮 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 一个长度为M的正整数数组A,表示从左向右的地形高度. ...
- Transaction Managament(事务管理一、概念)
什么是事务 对于一个软件系统来说,我们需要相应的数据资源来保存体统状态.在对系统状态所依托的数据资源的时候,为了保证系统始终处于“正确”状态,我们必须对这些访问操作进行一些必要的限定.以保证系统状态的 ...
- LeetCode——39. 组合总和
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的数字可以无限制重复被选 ...
- spring boot 环境配置(profile)切换
Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...
- PAT Advanced 1155 Heap Paths (30) [DFS, 深搜回溯,堆]
题目 In computer science, a heap is a specialized tree-based data structure that satisfies the heap pr ...
- SpringBoot+Shiro+DB (二)
之前我们完成了Spring+Shiro的最基本配置搭建,现在我们再增加上DB,毕竟没有哪个系统会将用户.角色.权限等信息硬编码到代码里.DB选用myslq. 数据库准备 脚本如下.依然是两个用户:ad ...
- Tensorflow学习教程------参数保存和提取重利用
#coding:utf-8 import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data mni ...
- VMware Workstation 12 PRo密钥
注意:手动输入(起初复制输入,一个都没成功,不要偷懒哦) VMware Workstation 12序列号: 5A02H-AU243-TZJ49-GTC7K-3C61N