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代表北 ...
随机推荐
- 解决Affter Effect汉化版(cc2015之后的版本)中出现表达式错误的一种常用方法
解决Affter Effect出现表达式错误的一种常用方法 问题:汉化版的AE中,使用模板会出现表达式错误之类的提示,可能会导致某些设置或者效果失效 解决办法: 方法一.将配置文件中的zh_CN 改为 ...
- XML转换成TXT行数据的Java程序
ZKe ------------------- XML数据的一个块内的所有属性,转换成TXT文件的一行.众所周知XML文件是通过类似HTML的标签进行数据的定义如图所示 属性由id, article, ...
- 【SpringBoot】14. SpringBoot多环境配置
SpringBoot多环境配置 Spring Boot 1.5.19.RELEASE 假设项目中需要3个环境--开发.测试.生产 profile :代表的就是一个环境变量 语法结构:applicati ...
- leetcode113:sudoku-solver
题目描述 请编写一个程序,给数独中的剩余的空格填写上数字 空格用字符'.'表示 假设给定的数独只有唯一的解法 这盘数独的解法是: 红色表示填上的解 Write a program to solve a ...
- Oracle数据库操作相关
1. 导出dmp 文件 (1)导出数据库所有的用户数据: exp system/manage@ORCL file=D:\oracle_dmp\data1.dmp full=y (2)导出指定的用户数据 ...
- 思科ASA放行主/被动FTP
实验环境: 设备说明: internet是一台windows10,用于模拟外网客户 ASA是思科ASA防火墙 FTP-SERVER是Centos7,Centos7上安装了vsftpd 实验说明: 本文 ...
- c++与c
const char* c_str ( ) const; Get C string equivalent Generates a null-terminated sequence of charact ...
- 'sortbitwise'是什么意思
问题 flag sortbitwise 在ceph中是什么意思,在Jewel版本下可以看到多了这个flags [root@lab8106 current]# ceph -s cluster ffe7a ...
- 微信_跳一跳辅助程序_Python_(带GitHub项目地址)
1.安装Python(推荐3.6) https://www.python.org/downloads/ 2.在github上下载脚本 [github项目地址](https://github.com/w ...
- Python_爬虫项目
1.爬虫--智联招聘信息搜集 原文链接 1 #-*- coding: utf-8 -*- 2 import re 3 import csv 4 import requests 5 from tq ...