本文目前提供:LocalDateTime获取时间戳(毫秒/秒)、LocalDateTime与String互转、Date与LocalDateTime互转
LocalDate转Date LocalDate nowLocalDate = LocalDate.now(); Date date = Date.from(localDate.atStartOfDay( ZoneOffset.ofHours(8)).toInstant()); LocalTime转Date public void LocalTimeToUdate() { LocalTime localTime = LocalTime.now(); LocalDate localDa
JDK8中的新特性:用 LocalDateTime 与 DateTimeFormatter 代替了老的 Date 与 SimpeDateFormat,更加的方便,进行时间日期的运算也更加简洁了。
Tiago Fernandez做了一个很有意思的投票,统计对Java API的不满意程度,最终Java Date/Time/Calendar API被评为最烂API第二名(第一为XML/DOM)。
最近刚好有新项目使用到JSR-310(JDK8)中引入的新日期API,打算做一下总结。本文编写基于JDK11,部分API可能是JDK9之后新增的。
新时间对象: 1.LocalDate表示年月日 2.LocalTime表示时分秒 3.LocalDateTime表示年月日时分秒 4.Instant:表示时刻,不直接对应年月日信息,需要通过时区转换 5.ZonedDateTime: 表示特定时区的日期和时间 6.ZoneId/ZoneOffset:表示时区 1、获取对象的方法 //通过静态方法now()获取当前时间 LocalDate now1 = LocalDate.now(); LocalTime now2 = LocalTim
10位时间戳就是从1970-01-01到当前的秒数,注意,不是毫秒数,所以需要按毫秒解析时,要 * 1000 13位时间戳就是从1970-01-01到当前的毫秒数,在java中用Instant对象对应。
其他的类库还有Year、Month、DayOfWeek、MonthDay、YearMonth等。值得注意的是:JSR-310增加的日期API是严格区分年月日-时分秒格式的日期表示类,例如XXXDateTime一定表示为年月日时分秒(纳秒),XXXTime只能表示时分秒(纳秒),XXXDate只能表示年月日。
jdk8之前我们一直在用Date、Calender和SimpleDateFormat,但它的API不够强大,还存在线程安全问题,一直被人诟病。jdk8提供了新的时间API,在java.time包里的类是不可变且线程安全的,它和Joda是同一个作者实现的,因此借鉴了Joda很多特点,如果你用习惯Joda,可以很方便地切换到java.time类的使用
伴随 lambda表达式、streams 以及一系列小优化,Java 8 推出了全新的日期时间API。
java.sql.Timestamp 类是 Java 中用于精确表示日期和时间的数据类型,特别适用于在与数据库交互时处理时间戳信息。
我们先来看一些基本概念,然后再介绍 Java 的日期和时间 API。关于日期和时间,有一些基本概念,包括时区、时刻、纪元时、年历等。
Java8发布,已有数年之久,但是发现很多人都还是坚持着用SimpleDateFormat和Date进行时间操作。SimpleDateFormat这个类不是线程安全的,在使用的时候稍不注意,就会产生致命的问题。Date这个类,是可以重新设置时间的,这对于一些类内部的属性来说,是非常不安全的。
An instantaneous point on the time-line. 中文描述就是Instant表示高精度时间戳。
发布优惠券的时候,每个店铺都可以发布优惠券,当用户抢购的时候,优惠券表中的id如果使用数据库的自增长ID会存在以下问题:
本系列的目的是明明白白、彻彻底底的搞定日期/时间处理的几乎所有case。上篇文章 铺设所有涉及到的概念解释,例如GMT、UTC、夏令时、时间戳等等,若你还没看过,不仅强烈建议而是强制建议你前往用花5分钟看一下,因为日期时间处理较为特殊,实战必须基于对概念的了解,否则很可能依旧雾里看花。
也许平时开发中你只用到过LocalDateTime这个API,那是极好的,但是不能止步于此,否则就图样图森破了。
/** * Instant:瞬时实例 * LocalDate:本地日期 不包含具体时间 例如 2020-02-02 可以用来记录纪念日 * LocalDTime:本地时间 不包含日期 * LocalDateTime:结合了日期和时间 但不包含时差和时区 * ZonedDateTime:完整的日期时间,包含时区和相对UTC或格林威治的视察 * * ZoneOffSet,ZoneId:操作时区 * * DateTime
这边值得一提的是在中国的时区偏移是8小时,本次示例转的时间戳是秒级别,得到的值是一个long值;知识追寻者这边是当前时间,故读者得到的结果与知识追寻者得到的结果不一致;读者可以使用站长工具进行测试校验
Java8 以前关于时间的类是 Date 和 Calendar,不过这两个类设计的很有问题,一个是带有默认的时区(timezone),另一个是类是 mutable 的,这样在使用时要特别注意线程安全问题,而且也没有办法阻止其他的线程修改日期。
Java 8为Date和Time引入了新的API,以解决旧java.util.Date和java.util.Calendar的缺点。
在JDK1.0的时候,Java引入了java.util.Date来处理日期和时间;在JDK1.1的时候又引入了功能更强大的java.util.Calendar,但是Calendar的API还是不尽如人意,,存在实例易变、没有处理闰秒等等的问题。所以在JDK1.8的时候,Java引入了java.timeAPI,这才真正修改了过去的缺陷,且更为好用。本篇就详细介绍一下JDK1.8的日期和时间API。
在使用hutool工具包的时候,发现hutool工具包无法判断是否是工作日还是节假日(因为每年节假日各不相同,所以自己写了一个) 当前只有2021年的数据,后续的数据需要等国务院发布 节假日数据来源:国务院办公厅关于2021年部分节假日安排的通知
resources 目录下(与application.properties配置文件同级)新建一个文件 holiday.txt
本节继续探讨Java 8的新特性,主要是介绍Java 8对日期和时间API的增强,关于日期和时间,我们在之前已经介绍过两节了,32节介绍了Java 1.8以前的日期和时间API,主要的类是Date和Calendar,由于它的设计有一些不足,业界广泛使用的是一个第三方的类库Joda-Time,关于Joda-time,我们在33节进行了介绍。Java 1.8学习了Joda-time,引入了一套新的API,位于包java.time下,本节,我们就来简要介绍这套新的API。 我们先从日期和时间的表示开始。 表示
Java 8另一个新增的重要特性就是引入了新的时间和日期API,它们被包含在java.time包中。借助新的时间和日期API可以以更简洁的方法处理时间和日期。
随着lambda表达式、streams以及一系列小优化,Java8推出了全新的日期时间API,在一下的指南中我们将通过一些简单的示例来学习如何使用新API。Java处理日期、日历和时间的方式一直为社区所诟病,将java.util.Date设定为可变类型,以及SimpleDateFormat的非线程安全使其应用非常受限。Java也意识到需要一个更好的API来满足社区中已经习惯了使用JodaTime API的人们。全新API的众多好处之一就是,明确了日期时间概念,例如:瞬时(instant)、期间(duration)、日期、时间、时区和周期。同时继承了Joda库按人类语言和计算机各自解析的时间处理方式。不同于老版本,新API基于ISO标准日历系统,java.time包下的所有类都是不可变类型而且线程安全。下面是新版API中java.time包里的一些关键类:
真诚与朴实是天才的宝贵品质。——斯坦尼斯拉夫斯基 System.out.println("下面的是两个默认时区的LocalDateTime"); final LocalDateTime localDateTime = LocalDateTime.ofInstant(new Date().toInstant(), ZoneId.systemDefault()); final LocalDateTime localDateTime1 = LocalDateTime.now(); System.out.p
本章包括 20 个涉及日期和时间的问题。这些问题通过Date、Calendar、LocalDate、LocalTime、LocalDateTime、ZoneDateTime、OffsetDateTime、OffsetTime、Instant等涵盖了广泛的主题(转换、格式化、加减、定义时段/持续时间、计算等)。到本章结束时,您将在确定日期和时间方面没有问题,同时符合您的应用的需要。本章介绍的基本问题将非常有助于了解日期-时间 API 的整体情况,并将像拼图中需要拼凑起来的部分一样解决涉及日期和时间的复杂挑战。
Java8 带来了全新的处理日期和时间的方式。几乎所有人都有使用Java Date API痛苦的经历。因此有很多人切换到了Joda Time,但是Java8现在有了媲美Joda的时间API。在学习API前,先了解一下日期和时间的概念。Java日期遵循公历规则。表示时间和日期的类放在java.time包中。在这个包里比较重要的API有:
Java中各种时间类型相互转换 参数声明: final Date date = new Date(); final Timestamp timestamp = new Timestamp(date.getTime()); final Calendar calendar = Calendar.getInstance(); final Instant instant = Instant.now(); final LocalDateTime localDateTime = LocalDa
当多个线程使用同一个时间处理对象进行对日期的格式化的时候,会出现java.lang.NumberFormatException: multiple points。主要原因是由于SimpleDateFormat是线程不安全的,当线程共享的时候,会引发这个异常。
例如,现有的类(例如java.util.Date和SimpleDateFormatter)是非线程安全的,从而导致用户潜在的并发问题,这不是一般开发人员在编写日期处理代码时会期望处理的问题。 一些日期和时间类还表现出相当差的API设计。例如,年份java.util.Date从1900开始,月份从1开始,天从0开始,这不是很直观。
时间不分东西南北、在地球的每一个角落都是相同的。他们都有一个相同的名字,叫时间戳。
除了lambda表达式,stream以及几个小的改进之外,Java 8还引入了一套全新的时间日期API,在本篇教程中我们将通过几个简单的任务示例来学习如何使用Java 8的这套API。Java对日期,日历及时间的处理一直以来都饱受诟病,尤其是它决定将java.util.Date定义为可修改的以及将SimpleDateFormat实现成非线程安全的。看来Java已经意识到需要为时间及日期功能提供更好的支持了,这对已经习惯使用Joda时间日期库的社区而言也是件好事。关于这个新的时间日期库的最大的优点就在于它定义清楚了时间日期相关的一些概念,比方说,瞬时时间(Instant),持续时间(duration),日期(date),时间(time),时区(time-zone)以及时间段(Period)。同时它也借鉴了Joda库的一些优点,比如将人和机器对时间日期的理解区分开的。Java 8仍然延用了ISO的日历体系,并且与它的前辈们不同,java.time包中的类是不可变且线程安全的。新的时间及日期API位于java.time包中,下面是里面的一些关键的类:
计算两个时间相差的天数(支持跨月、跨年): /** * JDK 8计算两个时间相差的天数,支持跨月、跨年 * @param startTimeStamp 开始时间戳 * @param endTimeStamp 结束时间戳 * @return 相距天数,若开始时间大于结束时间, * 则返回对应复数 */ public long diffDays(long startTimeStamp,long endTimeStamp){
在了解完java8中新版本的时间API之后,当然,并不是全部了解,java.time包下面接近上百个类,没办法一一去了解。作为我们日常用来替换java.util.date的功能。也不需要全部了解。在看过若干代码之后,有如下总结。
时间不分东西南北、在地球的每一个角落都是相同的。他们都有一个相同的名字,叫时间戳。时间戳 指的就是Unix时间戳(Unix timestamp)。它也被称为Unix时间(Unix time)、POSIX时间(POSIX time),是一种时间表示方式,定义为从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数。
Java8引入了一套全新的时间日期API,本篇随笔将说明学习java8的这套API。 java.time包中的是类是不可变且线程安全的。新的时间及日期API位于java.time中,下面是一些关键类 ●Instant——它代表的是时间戳(1970-01-01 00:00:00) ●LocalDate——不包含具体时间的日期,比如2014-01-14。它可以用来存储生日,周年纪念日,入职日期等。 ●LocalTime——它代表的是不含日期的时间 ●LocalDateTime——它包含了日期及时间,不
领取专属 10元无门槛券
手把手带您无忧上云