JDK8日期类入门
关于jdk8的时间类的用法,网上有很多教程教你如何用,比如:
System.out.println(LocalDateTime.now());
可以获取当前的时间,
2020-12-06T18:02:39.215
但我想从另一个角度来思考这些时间类。
首先,我想明确一个观点:
JDK8中的日期类是什么?
我认为其本质就是对这个世界上时间的一种抽象封装。
为什么这么说呢,耐心点看下去。
第一个问题,地球上的时间从哪来?
害。这不是屁话么,小学生都知道地球上的时间是通过地球绕太阳公转来的,以本初子午线为0时区,将地球划分为12个时区。比如北京就在东8区,也就是UTC/GMT+08:00
(图片来自百度)
所以第一个概念就有了,那就是时区,JDK8里称为Zone,对应的用来求指定时区的类是ZonedDateTime,以下为代码示例:
import java.time.ZoneId;
import java.time.ZonedDateTime;
/**
* @author Alin
* @desc //TODO
* @date 2020/12/6
*/
public class TestLocalDateTime {
public static void main(String[] args) {
final ZonedDateTime now = ZonedDateTime.now();
System.out.println(now);
final ZonedDateTime zonedDateTime = ZonedDateTime.now(ZoneId.of("Asia/Tokyo"));
System.out.println(zonedDateTime.toString());
}
}
从结果可以看出,不同时区对应的时间不同,东京比上海快了一个小时:
2020-12-06T19:02:59.765+08:00[Asia/Shanghai]
2020-12-06T20:02:59.766+09:00[Asia/Tokyo]
当然,这个世界的时间设计不可能只有时区,以东8区举例,
此时区内该如何计算时间呢?
JDK8提供了几种方式,比如:
- LocalDateTime
- LocalDate
- Instant
代码示例:
public class TestLocalDateTime {
@Test
void test2(){
System.out.println(LocalDateTime.now());
System.out.println(LocalDate.now());
final Instant now = Instant.now();
System.out.println(now);
System.out.println(now.toEpochMilli());
System.out.println(System.currentTimeMillis());
System.out.println(LocalTime.now());
}
}
2020-12-06T19:36:35.323
2020-12-06
2020-12-06T11:36:35.323Z
1607254595323
1607254595328
19:36:35.328
从结果看,LocalDateTime可以获得当前时区的年月日时分秒,LocalDate则是年月日,Instant则可以获取自1970-01-01T00:00:00Z到现在的毫秒数,LocalTime就是时分秒了,注意,此四类获取的结果是不考虑时区的,都是指默认时区。
从命名上看的也很明显,Local指本地(本时区、系统默认时区),Date指日期,Time指时间。
按照逻辑推断,其中必然有转换关系,知道了年月日时分秒,那肯定能单独转换为年月日或者时分秒吧,的确JDK8也做了封装:
public class TestLocalDateTime {
@Test
void test3(){
final LocalDateTime localDateTime = LocalDateTime.now();
final LocalDate localDate = LocalDate.now();
final LocalTime localTime = LocalTime.now();
final Instant instant = Instant.now();
final LocalDate toLocalDate = localDateTime.toLocalDate();
final LocalTime toLocalTime = localDateTime.toLocalTime();
final long milli = localDateTime.toInstant(ZoneOffset.UTC).toEpochMilli();
}
}
我们这个世界还需要哪些时间单位呢?
比如,年、月、周、日,对应的类如Year、Month、DayOfWeek、MonthDay,被设计用来增强代码的可读性和可靠性。
时间也是有范围的,比如几个小时/持续了几秒/天/月等:
Duration表示以秒和纳秒为基准的时长。例如,“10.3秒”。
Period表示以年、月、日衡量的时长。例如,“1年5个月零13天”。
另外,该如何格式化日期呢,这个JDk8也有封装,最常用的DateTimeFormatter就可以做到:
public class TestLocalDateTime {
@Test
void test4(){
final LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
}
}
还有一个很方便的工具类TemporalAdjusters,代码如下:
public class TestLocalDateTime {
@Test
void test5(){
final LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime);
final LocalDateTime with = localDateTime.with(TemporalAdjusters.lastDayOfMonth());
System.out.println(with);
}
}
可以方便的计算诸如本月的最后一天等等问题,具体可自查api:
2020-12-06T20:07:26.181
2020-12-31T20:07:26.181
JDK8日期类入门的更多相关文章
- 经常使用的系统类Math、Arrays、System、BigInteger和BigDecimal以及日期类,时间戳
一.Math 常用类: //看看Math常用的方法(静态方法)//1.abs绝对值int abs = Math . abs(-9);System. out . printLn(abs);//9//2. ...
- JAVA基础学习之final关键字、遍历集合、日期类对象的使用、Math类对象的使用、Runtime类对象的使用、时间对象Date(两个日期相减)(5)
1.final关键字和.net中的const关键字一样,是常量的修饰符,但是final还可以修饰类.方法.写法规范:常量所有字母都大写,多个单词中间用 "_"连接. 2.遍历集合A ...
- Java:日历类、日期类、数学类、运行时类、随机类、系统类
一:Calendar类 java.util 抽象类Calendar 1.static Calendar getInstance()使用默认时区和语言环境获得一个日历. 2. int get(int ...
- HDOJ(HDU) 2133 What day is it(认识下Java的Calendar类---日期类)
Problem Description Today is Saturday, 17th Nov,2007. Now, if i tell you a date, can you tell me wha ...
- Problem B: 时间和日期类(III)
Problem B: 时间和日期类(III) Time Limit: 4 Sec Memory Limit: 128 MBSubmit: 2889 Solved: 1732[Submit][Sta ...
- 日历类和日期类转换 并发修改异常 泛型的好处 *各种排序 成员和局部变量 接口和抽象类 多态 new对象内存中的变化
day07 ==和equals的区别? ==用于比较两个数值 或者地址值是否相同. equals 用于比较两个对象的内容是否相同 String,StringBuffer.StringBuilde ...
- 日期类的使用(java)-蓝桥杯
蓝桥杯日期问题常考,java提供了日期类很方便: //日历类 Calendar c = Calendar.getInstance(); // 获取实例化对象 Date date =c.getTime( ...
- C++实验:时间和日期类
描述 用C++实现日期类CDate和时间类CTime,并在次基础上利用多继承实现日期时间类CDateTime,使其能输出样例信息. 主函数里的代码已经给出,请补充完整,提交时请勿包含已经给出的代码. ...
- 日期类时间类,日期时间类,单例模式,装箱与拆箱,数字类随机数,BigDecimal总结
1.日期类,时间类,日期时间类 初步日期使用方法及格式转换方法(旧方法): 格式://Mon Jul 30 11:26:05 CST 2018 年月日时分秒 CST代表北 ...
随机推荐
- Docker 基础 B站 学习 最强 教程
狂神说!! https://www.bilibili.com/video/BV1og4y1q7M4
- leetcode128-generate-parentheses
题目描述 给出n对括号,请编写一个函数来生成所有的由n对括号组成的合法组合. 例如,给出n=3,解集为: "((()))", "(()())", "( ...
- Docker 运行 SQL Server 容器映像
随着.Net Core迭代,大家也都用上了Linux用上了Docker.跟.Net经常配套使用的SQL SERVER以前一直是windows only,但是从SQL Server 2017开始已经支持 ...
- Python--安装 PyQt5, pyqt5-tools
# 使用豆瓣镜像源 anaconda prompt界面里输入: pip install pyqt5-tools -i https://pypi.douban.com/simple/
- python_登陆验证文件上传下载_socket
client.py import os import sys import json import struct import socket # 下载--接收文件 def download(sk): ...
- 基于FFmpeg的Dxva2硬解码及Direct3D显示(三)
初始化Direct3D 目录 初始化Direct3D 创建Direct3D物理设备对象实例 创建Direct3D渲染设备实例 创建Direct3D视频解码服务 Direct3D渲染可以通过Surfac ...
- TCP回射客户服务器模型(02 设置套接字选项、处理多并发)
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen); //设置套接字选项 ...
- Java的强引用、软引用、弱引用、虚引用
背景 工程中用到guava的本地缓存.它底层实现和API接口上使用了强引用.软引用.弱引用.所以温故知新下,也夯实下基础. 预备知识 先来看下GC日志每个字段的含义 Young GC示例解释 [GC ...
- 企业网络拓扑VRRP主备功能实例(一)
组网图形 VRRP主备备份简介 通常,同一网段内的所有主机上都存在一条相同的.以网关为下一跳的缺省路由.主机发往其他网段的报文将通过缺省路由发往网关,再由网关进行转发,从而实现主机与外部网络的通信. ...
- async await 你真的用对了吗?
大部分同学了解Promise,也知道async await可以实现同步化写法,但实际上对一些细节没有理解到位,就容易导致实际项目中遇到问题. 开始先抛结论,下文将针对主要问题点进行论述. 1.所有as ...