关于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();
}
}

我们这个世界还需要哪些时间单位呢?

比如,年、月、周、日,对应的类如YearMonthDayOfWeekMonthDay,被设计用来增强代码的可读性和可靠性。

时间也是有范围的,比如几个小时/持续了几秒/天/月等:

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日期类入门的更多相关文章

  1. 经常使用的系统类Math、Arrays、System、BigInteger和BigDecimal以及日期类,时间戳

    一.Math 常用类: //看看Math常用的方法(静态方法)//1.abs绝对值int abs = Math . abs(-9);System. out . printLn(abs);//9//2. ...

  2. JAVA基础学习之final关键字、遍历集合、日期类对象的使用、Math类对象的使用、Runtime类对象的使用、时间对象Date(两个日期相减)(5)

    1.final关键字和.net中的const关键字一样,是常量的修饰符,但是final还可以修饰类.方法.写法规范:常量所有字母都大写,多个单词中间用 "_"连接. 2.遍历集合A ...

  3. Java:日历类、日期类、数学类、运行时类、随机类、系统类

    一:Calendar类 java.util 抽象类Calendar   1.static Calendar getInstance()使用默认时区和语言环境获得一个日历. 2. int get(int ...

  4. 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 ...

  5. Problem B: 时间和日期类(III)

    Problem B: 时间和日期类(III) Time Limit: 4 Sec  Memory Limit: 128 MBSubmit: 2889  Solved: 1732[Submit][Sta ...

  6. 日历类和日期类转换 并发修改异常 泛型的好处 *各种排序 成员和局部变量 接口和抽象类 多态 new对象内存中的变化

    day07 ==和equals的区别? ==用于比较两个数值 或者地址值是否相同.  equals 用于比较两个对象的内容是否相同   String,StringBuffer.StringBuilde ...

  7. 日期类的使用(java)-蓝桥杯

    蓝桥杯日期问题常考,java提供了日期类很方便: //日历类 Calendar c = Calendar.getInstance(); // 获取实例化对象 Date date =c.getTime( ...

  8. C++实验:时间和日期类

    描述 用C++实现日期类CDate和时间类CTime,并在次基础上利用多继承实现日期时间类CDateTime,使其能输出样例信息. 主函数里的代码已经给出,请补充完整,提交时请勿包含已经给出的代码. ...

  9. 日期类时间类,日期时间类,单例模式,装箱与拆箱,数字类随机数,BigDecimal总结

    1.日期类,时间类,日期时间类 初步日期使用方法及格式转换方法(旧方法): 格式://Mon Jul 30 11:26:05 CST 2018             年月日时分秒    CST代表北 ...

随机推荐

  1. 阿里巴巴开发手册强制使用SLF4J作为门面担当的秘密,我搞清楚了

    之前已经详细.全面地介绍了 Log4j,相信小伙伴们已经完全掌握了.那我在读嵩山版的阿里巴巴开发手册(没有的小伙伴,记着找我要)的时候,就发现了一条「强制」性质的日志规约: 应用中不可以直接使用日志系 ...

  2. Python面试题及答案汇总整理(2019版)

    发现网上很多Python面试题都没有答案,所以博主花了很长时间搜集整理了这套Python面试题及答案,由于网上的Python相关面试题大多数都是2019年的,所以我这个也是2019版的,哈哈~ (文末 ...

  3. 监控-Cat项目部署

    一.Cat的项目背景 CAT(Central Application Tracking),是美团点评基于 Java 开发的一套开源的分布式实时监控系统.美团点评基础架构部希望在基础存储.高性能通信.大 ...

  4. 论文解读 - MaskGAN:BETTER TEXT GENERATION VIA FILLING IN THE _____

    1 简介 文本生成是自然语言处理中一个重要的研究领域,具有广阔的应用前景.当前主流的用来进行文本生成的模型主要是Seq2Seq模型,通常利用maximum likelihood和teacher for ...

  5. absolute与relative 的超越

    relative 超越了自身而已,所有位置的变化是相对于正常流下自身的表现而言 absolute  超越了父容器,位置信息是基于父容器的位置而言

  6. go-zero 如何扛住流量冲击(一)

    不管是在单体服务中还是在微服务中,开发者为前端提供的API接口都是有访问上限的,当访问频率或者并发量超过其承受范围时候,我们就必须考虑限流来保证接口的可用性或者降级可用性.即接口也需要安装上保险丝,以 ...

  7. startup乱码解决方法

    1.用记事本方式打开:‪apache-tomcat-8.5.59\conf\logging.properties 2.使用快捷键(Ctrl+H)把UTF-8全部替换为:GBK,进行保存(Ctrl+s) ...

  8. tcp输入数据 慢速路径处理 tcp_data_queue_ofo

    tcp_data_queue_ofo 在新内核的实现中ofo队列实际上是一颗红黑树.在tcp_data_queue_ofo中根据序号,查找到合适位置,合并或者添加到rbtree中.同时设置dsack和 ...

  9. IP 层收发报文简要剖析5--ip报文发送2

    udp 发送ip段报文接口ip_append_data ip_append_data 函数主要用来udp 套接字以及raw套接字发送报文的接口.在tcp中发送ack 以及rest段的ip_send_u ...

  10. [开源]CSharpFlink(NET 5.0开发)分布式实时计算框架,PC机10万数据点秒级计算测试说明

    github地址:https://github.com/wxzz/CSharpFlinkgitee地址:https://gitee.com/wxzz/CSharpFlink  1         计算 ...