死磕 Java 8 的日期处理

TIME

  • Java 8 推出了全新的日期时间API并且已经很久了,因为业务中遇到的时间处理的还是不多,因此用的也少,而且大多是用封装好的时间共计包,就更少接触java8 的时间类型API了,因此对他不是很熟,今天遇到了一下问题打算总结一下:
  • Java处理日期、日历和时间的不足之处:将 java.util.Date 设定为可变类型,以及 SimpleDateFormat 的非线程安全使其应用非常受限。然后就在 java8 上面增加新的特性。
  • 全新API的好处之一就是,明确了日期时间概念,例如:瞬时(instant)、 长短(duration)、日期、时间、时区和周期这些概念都是分开的,并且有独立的对象来处理。
  • 重要的是:同时继承了Joda 库按人类语言和计算机各自解析的时间处理方式。不同于老版本,新API基于ISO标准日历系统,java.time包下的***所有类都是不可变类型而且线程安全***。

关键类

  • Instant:瞬时实例。
  • LocalTime:本地时间,不包含日期。只有时分秒纳秒等信息
  • LocalDate:本地日期,不包含具体时间 例如:2014-01-14 可以用来记录生日、纪念日、加盟日等。只有年月日信息
  • LocalDateTime:组合了日期和时间,但不包含时差和时区信息。包含所有年月日时分秒纳秒等信息
  • 以上三个是类似的PAI,都有差不多一样的方法和处理方式,只是表达的时间范围是不一样的。这一点用起来还是非常方便的
  • ZonedDateTime:最完整的日期时间,包含时区和相对UTC或格林威治的时差。这个类用来处理带时区的时间信息
  • 新API还引入了 ZoneOffSet 和 ZoneId 类,使得解决时区问题更为简便。解析、格式化时间的 DateTimeFormatter 类也全部重新设计。具体时区用这两个处理

当前时间

/*** java时间类型,新旧api对比*/public static void getCurrentDate() {LocalDate today = LocalDate.now();System.out.println("today's local date: " + today);Date date = new Date();System.out.println("today's date is: " + date);}

获取对应时间年月日,时分秒

/*** LocalDate 获取年月日信息,与之前Calendar对比*/public static void getDetailDate() {LocalTime todayTime = LocalTime.now();int second = todayTime.getSecond();int minute = todayTime.getMinute();int hour = todayTime.getHour();int nano = todayTime.getNano();System.out.println("秒: " + second + "分: " + minute + "时: " + hour + "纳秒: " + nano);LocalDate today = LocalDate.now();int year = today.getYear();int month = today.getMonthValue();int day = today.getDayOfMonth();int day_year = today.getDayOfYear();System.out.println(year + ": " + month + ": " + day + ": " + day_year);LocalDateTime localDateTime = LocalDateTime.now();System.out.println(localDateTime.getHour());}

处理特定日志 & 时间对比

 /*** 处理特定日志 & 时间对比*/public static void handleSpecilDate() {LocalDate localDate = LocalDate.of(2021, 11, 18);System.out.println(localDate);LocalDate date = LocalDate.of(2021, 6, 18);System.out.println(localDate.equals(date));}

处理生日这种周期性时间

/*** 检查生日这种周期性时间*/public static void cycleDate() {LocalDate localDate = LocalDate.now();LocalDate dateofBirth = LocalDate.of(2021, 6, 18);MonthDay birthday = MonthDay.of(dateofBirth.getMonth(), dateofBirth.getDayOfMonth());MonthDay nowDate = MonthDay.from(localDate);MonthDay monthParse = MonthDay.parse("2021-06-18", DateTimeFormatter.ofPattern("yyyy-MM-dd"));System.out.println(birthday.equals(nowDate));System.out.println(monthParse);}

yearMonth处理固定日期

 public static void checkCardExpiry() {YearMonth currenctYearMonth = YearMonth.now();System.out.println(currenctYearMonth + ": " + currenctYearMonth.lengthOfMonth());YearMonth credtCard = YearMonth.of(2021, Month.FEBRUARY);System.out.println(credtCard + ": " + credtCard.lengthOfMonth());DayOfWeek dayOfWeek = DayOfWeek.of(3);System.out.println(dayOfWeek);}

时间做加法

 /*** 时间做加法* LocalTime支持:* NANOS* MICROS* MILLIS* SECONDS* MINUTES* HOURS* HALF_DAYS*/public static void plusHours() {LocalTime localTime = LocalTime.now();localTime.plusHours(5);System.out.println(localTime);LocalTime nextWeek = localTime.plus(10, ChronoUnit.HOURS);System.out.println(nextWeek);System.out.println(localTime);LocalTime halfDay = localTime.plus(2, ChronoUnit.HALF_DAYS);System.out.println(halfDay);}/*** 日期做加法*/public static void plusDate() {LocalDate localDate = LocalDate.now();LocalDate tomorrow = localDate.plus(1, ChronoUnit.DAYS);System.out.println(tomorrow);LocalDate nextYear = localDate.plus(1, ChronoUnit.YEARS);LocalDate beforeYear = localDate.minus(1, ChronoUnit.YEARS);System.out.println("nextYear: " + nextYear);System.out.println("beforeYear: " + beforeYear);}/*** 日期+ 时间,*/public static void plusTime() {LocalDateTime localDateTime = LocalDateTime.now();System.out.println(localDateTime);LocalDateTime afterHour = localDateTime.plus(1, ChronoUnit.HOURS).plus(1, ChronoUnit.MINUTES).plus(1, ChronoUnit.YEARS);System.out.println(afterHour);LocalDateTime nowDate = LocalDateTime.of(2021, 6, 19, 17, 23, 57);System.out.println(nowDate);}

时间比较

  /*** 时间比较api*/public static void checkTimes() {LocalDateTime localDateTime = LocalDateTime.now();LocalDateTime afterDate = LocalDateTime.of(2021, 6, 19, 17, 23, 57);System.out.println(localDateTime.isBefore(afterDate));System.out.println(localDateTime.isAfter(afterDate));}

时区处理

   /*** 时区处理*/public static void zoneTime() {ZoneId america = ZoneId.of("America/Chicago");LocalDateTime dateAndTime = LocalDateTime.now();ZonedDateTime dateTimeInChicago = ZonedDateTime.of(dateAndTime, america);System.out.println(dateTimeInChicago);ZonedDateTime dateTimeInShenZhen = ZonedDateTime.ofInstant(Instant.now(), ZoneId.systemDefault());System.out.println(dateTimeInShenZhen);}/*** 包括时差信息的日期与时间*/public static void zoneOffSet() {LocalDateTime localDateTime = LocalDateTime.of(2021, Month.FEBRUARY, 14, 19, 24);ZoneOffset offset = ZoneOffset.of("+07:30");OffsetDateTime dateTime = OffsetDateTime.of(localDateTime, offset);System.out.println(dateTime);}

检查闰年

/*** 检查闰年*/
public static void isLeapYear() {LocalDate today = LocalDate.now();System.out.println(today.getYear() + "年是闰年:" + today.isLeapYear());}

计算日期间隔

*** 计算日期之间年,月,天数*/public static void calcDate() {LocalDate localDateTime = LocalDate.of(2021, 10, 28);LocalDate beforeDateTime = LocalDate.now().plus(3, ChronoUnit.DAYS);Period period = Period.between(localDateTime, beforeDateTime);System.out.println("year: " + period.getYears() + " month:" + period.getMonths() + " day:" + period.getDays());}

日期格式

/*** 格式化日期*/public static void formatDate() {String dayAfterTomorrow = "2021-06-18 15:53:06";DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");LocalDateTime formatDateTime = LocalDateTime.parse(dayAfterTomorrow, df);System.out.println("timeStr: " + dayAfterTomorrow + " dateTime:" + formatDateTime);String dayDate = "20210618";DateTimeFormatter dateDayFor = DateTimeFormatter.ofPattern("yyyyMMdd");LocalDate localDate = LocalDate.parse(dayDate, dateDayFor);System.out.println("timeStr: " + dayDate + " dateTime:" + localDate);String dayTime = "160451";DateTimeFormatter dayTimeFor = DateTimeFormatter.ofPattern("HHmmss");LocalTime localTime = LocalTime.parse(dayTime, dayTimeFor);System.out.println("timeStr: " + dayTime + " dateTime:" + localTime);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/310347.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我想快速给WPF程序添加托盘菜单

我想...1 简单要求:使用开源控件库在XAML中声明托盘菜单,就像给控件添加ContextMenu一样封装了常用命令,比如:打开主窗体、退出应用程序等TerminalMACS我在TerminalMACS中添加了托盘菜单,最终实现的托盘菜单效果&#…

【半译】在ASP.NET Core中创建内部使用作用域服务的Quartz.NET宿主服务

在我的上一篇文章《在ASP.NET Core中创建基于Quartz.NET托管服务轻松实现作业调度》,我展示了如何使用ASP.NET Core创建Quartz.NET托管服务并使用它来按计划运行后台任务。不幸的是,由于Quartz.NET API的工作方式,在Quartz作业中使用Scoped依…

mysql技术分享-- 视图是什么

视图 最近遇到mysql锁相关问题,在查阅资料时候,经常能看到在锁的解释中总有视图的概念出现,因此我觉得有必要先去了解一下视图相关的详细信息,有助于我对mysql锁相关的理解。视图(View)是一个命名的虚拟表…

在 Visual Studio 2019 中为 .NET Core WinForm App 启用窗体设计器

当我们在使用 Visual Studio 2019 非预览版本开发 Windows Forms App (.NET Core) 应用程序时是不能使用窗体设计器的。即使在窗体文件上右击选择“显示设计器”菜单,仍旧只能看到代码,无法打开窗体设计器。根据微软开发者博客的描述,我们可以…

mysql技术分享--表分区实现

分区表 分区概念 分区功能并不是在存储引擎层完成的,因此不止有InnoDB存储引擎支持分区,常见的存储引擎MyISAM,NDB等都支持。但是也并不是所有存储引擎都支持,比如CSV,FEDERATED,MERGE等就不支持&#xf…

视频号,张小龙的星辰大海

阅读本文大概需要 4.1分钟。前段时间,微信开通了视频号。本想第一时间写一篇文章,分析下视频号。发现理解还不深入,于是这段时间一直在思考视频号对微信的战略意义和它的前景。思考了接近1个月,想明白了一些事情,有时候…

[Java基础]List集合子类特点

ArrayList练习: package test19;import java.util.ArrayList; import java.util.Iterator;public class ArrayListDemo {public static void main(String[] args){ArrayList<String> array new ArrayList<String>();array.add("hello");array.add(&quo…

java8 stream案例分析

java8 stream Stream是java8 推出的一个处理集合类的一个全新的接口&#xff0c;在工作当中经常用到&#xff0c;并且他的预发规则与我们平台的有一点不一样&#xff0c;是流式的处理&#xff0c;非常类似RXJava的一个风格。java中对Stream的定义是&#xff1a; A sequence o…

[半翻] 设计面向DDD的微服务

这篇文章行文结构对照微软博客&#xff0c; 结合本人意译和多年实践的回顾性思考形成此次读书笔记。Domian-driven Design领域-驱动-设计&#xff08;DDD&#xff09;提倡基于(用例相关的现实业务)进行建模。1. DDD的视角DDD将现实问题视为领域;DDD将独立的问题描述为有界限的上…

数据结构与算法--数字在排序数组中出现次数

数字在排序数组中出现次数 题目&#xff1a;统计一个数字在一个排序数组中出现的次数。例如&#xff0c;输入数组{1,2&#xff0c;3&#xff0c;3,3&#xff0c;3,3&#xff0c;4,5} 和数字3&#xff0c;由于3 在数组中出现的次数是5&#xff0c;因此返回5 简单方案一 既然输…

【值得收藏】首次披露Facebook移动端软件的持续部署 | IDCF

&#xff08;图片来源于网络&#xff09;摘要持续部署是指软件更新一旦准备好就立即发布的实践方法&#xff0c;在业界越来越多地被采用。移动端软件的更新频率普遍落后于基于云端的服务&#xff0c;原因有很多。比如&#xff0c;移动端软件只能定期发布版本&#xff1b;用户可…

数据结构与算法--二叉树的深度问题

二叉树的深度 题目&#xff1a;输入一颗二叉树的根&#xff0c;求该树的深度。从根节点到叶子节点一次进过的节点形成的一条路径&#xff0c;最长的路径的长度为树的深度。如下图中二叉树的额深度4&#xff0c;因为从根节点A到叶子节点的路径中有4个节点A B E J 问题中定义了一…

进击谷歌:多线程下程序执行顺序怎么稳定不乱?

点击上方蓝字 关注我们面试官您好&#xff0c;我是来面试的您好&#xff0c;我是这次的面试官&#xff0c;先介绍一下自己把我是女孩&#xff0c;blala ....那问一个多线程的问题吧&#xff0c;在一个多线程的环境中&#xff0c;怎么能保证一系列方法的执行顺序呢&#xff1f;…

[Java基础]Set集合概述和特点

练习代码如下: package test21;import java.util.HashSet; import java.util.Set;public class SetDemo {public static void main(String[] args){Set<String> set new HashSet<String>();set.add("hello");set.add("world");set.add("…

深圳本次核酸检普筛怎么将个人信息和结果对应上??

前言 最近深圳疫情比较严重&#xff0c;好在上午新闻公布本次普筛都是阴性&#xff0c;期间我检查了三次&#xff0c;基本上每周测一次的样子&#xff0c;基本的检测非常快&#xff0c;只是需要筛查的人数太多&#xff0c;因此才有几公里的排队出现&#xff0c;期间也发现了一…

借助Redis完成延时任务

背景 相信我们或多或少的会遇到类似下面这样的需求&#xff1a;第三方给了一批数据给我们处理&#xff0c;我们处理好之后就通知他们处理结果。大概就是下面这个图说的。本来在处理完数据之后&#xff0c;我们就会马上把处理结果返回给对方&#xff0c;但是对方要求我们处理速度…

数据结构与算法--数组中出一次的数字

数组中出现一次的数字 题目&#xff1a;一个整型数组里面除了一个数字以外&#xff0c;其他数字都出现了两次。找出这个出现一次的数字&#xff0c;时间复杂度O(n)&#xff0c;空间复杂度O(1) 如上题中最简单的方法就是一次循环统计&#xff0c;之后在循环判断出值出现一次的数…