iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >一篇文章弄懂Java8中的时间处理
  • 317
分享到

一篇文章弄懂Java8中的时间处理

2024-04-02 19:04:59 317人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录前言LocalDateTimeZonedDateTimeInstant总结前言 java8借鉴了第三方日期库joda很多的优点 java.time包 类名描述Instant时间戳

前言

java8借鉴了第三方日期库joda很多的优点

java.time包

类名描述
Instant时间戳
Duration持续时间,时间差
LocalDate只包含日期,比如:2020-05-20
LocalTime只包含时间,比如:13:14:00
LocalDateTime包含日期和时间,比如:2020-05-20 13:14:00
Period时间段
ZoneOffset时区偏移量,比如:+8:00
ZonedDateTime带时区的时间
Clock时钟,比如获取目前美国纽约的时间

java.time.fORMat包

类名描述
DateTimeFormatter时间格式化

Java8提供了全新的时间处理框架,这里就可以完全丢弃之前的Date、Calendar了。

具体的api的使用都是比较简单的。这里就不展开介绍了。

这里主要介绍下一些主要的类

LocalDateTime

我们一般常用的就是这个了,用这个来表示日期时间。如LocalDateTime.now()就可以基于当前默认时区得到当前的日期时间。

由于全球有好多时区,同一个日期时间,在不同的时区,反映到时间轴上是不同的。

LocalDateTime类型的日期时间是没包含时区,所以它不能对应到时间轴上。说的直白点就是LocalDateTime不能转换成自 1970-01-01T00:00:00Z 纪元以来的毫秒数

ZonedDateTime

ZonedDateTime可以理解就是在LocalDateTime的基础上添加上时区,所以它是可以反映到时间轴上的。

下面用夏令时举个例子来看看LocalDateTime和LocalDateTime的区别。

夏令时是什么这里就不展开了,具体可以网上查下。看看我国1986开始的夏令时。

简单来说就是在夏令时开始的时候,将时钟向后拨1个小时。对应我国1986年开始的夏令时的做法,就是在每年四月中旬的第一个星期日当时钟到达凌晨2点时,直接将时钟拨到凌晨3点。也就是凌晨1点和凌晨3点之间之差1个小时。

由于1986年是开始实施的,所以1986年的夏令时是1986年5月4日开始的。

我们看看1987年的夏令时开始

根据我国当时的夏令时政策,1987年应该是1987年4月12日开始的。具体来说就是在1987-04-12 01:00:00 过一个小时后,时间应该是1987-04-12 03:00:00

        LocalDateTime localDateTime = LocalDateTime.of(1987, 4, 12, 1, 0, 0, 0);
        System.out.println(localDateTime);
        System.out.println(localDateTime.plusHours(1));

执行上面的代码就可以看到当1987-04-12 01:00:00增加1小时后,时间是1987-04-12 02:00:00。

这个也好理解,因为LocalDateTime并没有包含时区,1987-04-12 02:00:00这个夏令时只是中国的,并不是全球统一的,如果1987-04-12 02:00:00将直接变成1987-04-12 03:00:00放到中国以外的其他国家就是错误的。

        ZonedDateTime zonedDateTime = ZonedDateTime.of(1987, 4, 12, 1, 0, 0, 0, ZoneId.systemDefault());
        System.out.println(zonedDateTime);
        System.out.println(zonedDateTime.plusHours(1));

执行上面的代码可以看到当1987-04-12 01:00:00增加1小时后,时间变成了是1987-04-12 03:00:00。这个也就能说明问题了。

同时从打印结果也能看到时区自动从+08:00[Asia/Shanghai]变成了+09:00[Asia/Shanghai]

Instant

Instant表示时间轴上的一个瞬时时间,简单来说就是表示自 1970-01-01T00:00:00Z 纪元以来的秒数、毫秒数等等

ZonedDateTime和Instant都能对应到时间轴上,所以它们两个是可以相互转化的。

        Instant instant = zonedDateTime.toInstant();
        ZonedDateTime zonedDateTime1 = instant.atZone(zonedDateTime.getZone());

其他一些常用的各种类型之间转化的API

        //ZonedDateTime 转  Instant
        Instant instant = ZonedDateTime.now().toInstant();

 
        //获取UTC毫秒数
        long epochMilli = instant.toEpochMilli();
        

        //Instant 转  ZonedDateTime
        ZonedDateTime zonedDateTime = instant.atZone(ZoneId.systemDefault());

        //字符串 转  ZonedDateTime
        ZonedDateTime zonedDateTime2 = ZonedDateTime.parse(zonedDateTime.toString());

        //基于UTC 偏移的毫秒数
        int totalSeconds = zonedDateTime.getOffset().getTotalSeconds();

        //Instant 转  LocalDateTime
        LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());

        //LocalDateTime 转  ZonedDateTime
        ZonedDateTime zonedDateTime1 = localDateTime.atZone(ZoneId.systemDefault());


        ZoneRules zoneRules = ZoneId.systemDefault().getRules();

        //判断是否是夏令时时间
        boolean daylightSavings = zoneRules.isDaylightSavings(instant);


        Calendar calendar = Calendar.getInstance(TimeZone.getDefault());
        //Calendar 转 Instant
        Instant instant1 = calendar.toInstant();

        //Calendar  转   ZonedDateTime
        Calendar now = Calendar.getInstance();
        ZonedDateTime zdt = ZonedDateTime.ofInstant(now.toInstant(), ZoneId.systemDefault()));

        //Date 转 Instant
        Date date = new Date();
        Instant inst = date.toInstant();

        // Instant 转 Date
        Date newDate = Date.from(inst);

        //GreGorianCalendar 转 ZonedDateTime
        GregorianCalendar cal = GregorianCalendar.from(ZonedDateTime.now());
        TimeZone tz = cal.getTimeZone();
        ZonedDateTime zdt1 = cal.toZonedDateTime();
        
        //ZonedDateTime 转 GregorianCalendar
        GregorianCalendar newCal = GregorianCalendar.from(zdt1);

        LocalDateTime ldt = zdt.toLocalDateTime();
        LocalDate date2 = zdt.toLocalDate();
        LocalTime time2 = zdt.toLocalTime();

更详细的资料,还是看官方的文档吧。https://docs.oracle.com/javase/tutorial/datetime/index.html

总结

到此这篇关于Java8中时间处理的文章就介绍到这了,更多相关Java8时间处理内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 一篇文章弄懂Java8中的时间处理

本文链接: https://www.lsjlt.com/news/161962.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 一篇文章弄懂Java8中的时间处理
    目录前言LocalDateTimeZonedDateTimeInstant总结前言 java8借鉴了第三方日期库joda很多的优点 java.time包 类名描述Instant时间戳...
    99+
    2024-04-02
  • 一篇文章弄懂ECMAScript中的操作符
    目录一元操作符 布尔操作符 乘性操作符 加性操作符 关系操作符 相等操作符 条件操作符 赋值操作符 逗号操作符 总结一元操作符 只能操作一个值的操作符叫做一元操作符 递增和递减。递...
    99+
    2024-04-02
  • 一篇文章弄懂js中的typeof用法
    目录基础返回类型string 和 booleannumber 和 bigintsymbolundefinedfunctionobject其他常见问题引用错误typeof nullty...
    99+
    2024-04-02
  • 一篇文章弄懂Mybatis中#和$的区别
    目录前言一:下面我们写个关于“#”的个sql,看能不能注入。1.正常传参2.拼接传参二:下面我们写个关于“$”的个sql,看能不能注入。1.正常传参2.拼接传参总结前言 在学校的时候...
    99+
    2024-04-02
  • 一篇文章弄懂C#中的async和await
    目录前言 async await 从以往知识推导 创建异步任务 创建异步任务并返回Task 异步改同步 说说 await Task 说说 async Task<TResult&...
    99+
    2024-04-02
  • 一篇文章弄懂Python中的内建函数
    目录前言A类B类C类D类E类F类G类H类I类L类M类R类S类T类总结前言 python内建函数指的是python自带的函数,这种函数不需要定义,并且不同的内建函数具有不同的功能,可以...
    99+
    2024-04-02
  • 一篇文章弄懂javascript内存泄漏
    1、什么是内存泄漏 在了解什么是内存泄漏之前, 我们应该要对内存是什么有个概念, 随机存取存储器(英语:Random Access Memory,缩写:RAM)是与 CPU 直接交...
    99+
    2024-04-02
  • 一篇文章彻底弄懂Python中的if __name__ == __main__
    目录1. 引言2. 特殊变量3. 复杂的例子4. 使用场景5. 解决方案6. 总结1. 引言 在Python相关代码中,我们经常会遇到如下代码段: # stuff if __name...
    99+
    2022-12-08
    Python if __name__ == __main__ if__name__=='__main__'的作用 if __name__=='__main__'
  • 一篇文章彻底弄懂Java中二叉树
    目录一、树形结构1.1 相关概念1.2树的表示形式1.3树的应用:文件系统管理(目录和文件)二、二叉树2.1相关概念2.2 二叉树的基本形态2.3 两种特殊的二叉树2.4 二叉树的性...
    99+
    2024-04-02
  • Python一篇文章看懂时间日期对象
    目录一、时间对象time1.测量运行时间方法①process_time()②perf_counter()③monotonic()2.函数性能计算器二、日期对象datetime1.格式...
    99+
    2024-04-02
  • 一篇文章看懂Java异常处理
    目录异常的定义异常的分类异常的处理方法try…catch处理throw 和throws自定义异常总结异常的定义 在java中,异常就是java在编译、运行或运行过程中出现的错误 总共...
    99+
    2024-04-02
  • 一篇文章让你弄懂Java运算符
    目录1. 运算符是什么1.1 定义:1.2 常见运算符的概述1.3 表达式1.3.1 定义1.3.2 表达式的类型2. 算数运算符2.1 分类:2.2 基本四则运算符:加减乘除模(+...
    99+
    2024-04-02
  • 如何搞懂Java8中的时间处理
    今天就跟大家聊聊有关如何搞懂Java8中的时间处理,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。前言java8借鉴了第三方日期库joda很多的优点java.time包类名描述Inst...
    99+
    2023-06-26
  • 一篇文章弄懂Java和Kotlin的泛型难点
    目录一、泛型类型 二、为什么需要泛型 三、类型擦除 四、类型擦除的后遗症 五、Kotlin 泛型 六、上界约束 七、类型通配符 & 星号投影 八、协变 & 不变 九、...
    99+
    2024-04-02
  • 一篇文章彻底弄懂Python字符编码
    目录1. 字符编码简介1.1. ASCII1.2. MBCS1.3. Unicode2. Python2.x中的编码问题2.1. str和unicode2.2. 字符编码声明2.3....
    99+
    2024-04-02
  • 一篇文章弄懂PHP和HTML的嵌套写法
    目录1.1全部php生成结构1.2html中嵌套php1.3博客项目1.3.1前后台1.3.2项目开发流程1.3.3创建数据库和表1.3.4添加博客类别1.3.5显示所有的博客类别1...
    99+
    2024-04-02
  • 一篇文章带你轻松搞懂Golang的error处理
    目录Golang中的errorerror的几种玩法哨兵错误自定义错误类型Wrap errorGolang1.13版本error的新特性errors.UnWrap()errors.Is...
    99+
    2024-04-02
  • 一篇文章弄懂MySQL查询语句的执行过程
    前言 需要从数据库检索某些符合要求的数据,我们很容易写出 Select A B C FROM T WHERE ID = XX  这样的SQL,那么当我们向...
    99+
    2024-04-02
  • 一篇文章弄懂JVM类加载机制过程以及原理
    目录一、做一个小测试二、类的初始化步骤:三、看看你写对了没?四、类的加载过程五、类加载器的分类1、启动类加载器(引导类加载器)2、扩展类加载器3、应用程序类加载器(系统类加载器)六、...
    99+
    2023-02-07
    jvm加载类的过程和机制 jvm加载类原理机制 java类加载原理
  • 一篇文章彻底弄懂C++虚函数的实现机制
    目录1、虚函数简介2、虚函数表简介3、有继承关系的虚函数表剖析3.1、单继承无虚函数覆盖的情况3.2、单继承有虚函数覆盖的情况3.3、多重继承的情况3.4、多层继承的情况4、总结1、...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作