(十八)Java的时间与日期(2)

news2024/11/18 20:28:59

目录

        前言:

        一、JDK8新增日期类

        二、LocalDate,LocalTime,LocalDateTime

        三、Instant时间戳

        四、DateTimeFormatter类

        五、Duration/Period类

        六、ChronoUnit类


前言:

        JDK 8中增加了一套全新的日期时间API,这套API设计合理,是线程安全的。新的日期及时间API位于 java.time 包 中,下面是一些关键类。

  • LocalDate :表示日期,包含年月日,格式为 2019-10-16
  • LocalTime :表示时间,包含时分秒,格式为 16:38:54.158549300
  • LocalDateTime :表示日期时间,包含年月日,时分秒,格式为 2018-09-06T15:33:56.750
  • DateTimeFormatter :日期时间格式化类。
  • Instant:时间戳,表示一个特定的时间瞬间。
  • Duration:用于计算2个时间(LocalTime,时分秒)的距离
  • Period:用于计算2个日期(LocalDate,年月日)的距离
  • ZonedDateTime :包含时区的时间

  Java中使用的历法是ISO 8601日历系统,它是世界民用历法,也就是我们所说的公历。平年有365天,闰年是366 天。此外Java 8还提供了4套其他历法,分别是:

  • ThaiBuddhistDate:泰国佛教历
  • MinguoDate:中华民国历
  • JapaneseDate:日本历
  • HijrahDate:伊斯兰历

一、JDK8新增日期类

概述:

        从JDK8开始,java.time包提供了新的日期和时间API,主要涉及的类型有:

 

        新增的API严格区分了时刻,本地日期,本地时间,并且,对日期和时间进行运算更加方便。

        其次,新API的类型几乎全部是不可变类型(和String的使用类似),可以放心使用不必担心被修改。

二、LocalDate,LocalTime,LocalDateTime

1.概述:

        它们分别表示日期,时间,日期时间对象,它们的类的实例是不可变的对象。

        它们三者构建对象和API都是通用的。

2.构建对象的方法如下:

 

3.修改相关的API

        ①LocalDate综合了LocalDate和LocalTime里面的方法,所以下面只用LocalDate和LocalTime来举例。

        ②这些方法返回的是一个新的实例引用,因为LocalDateTime,LocalDate,LocalTime都是不可变的。

 

4.代码演示:

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Date;
​
import static java.time.LocalTime.of;
​
/**
 * 从JDK8开始新增日期类(java.time包)
 * 1、localDate :不包含具体时间的日期(年月日)
 * 2、localTime : 不包含日期的时间(时分秒)
 * 3、localDateTime :包含了日期及时间(年月日时分秒)
 * 4、Instant :代表的是时间戳
 * 5、DateTimeFormatter 用于做时间的格式化和解析的
 * 6、Duration :用于计算两个时间间隔
 * 7、period :用于计算两个日期间隔
 * *新API严格区分了时刻、本地日期、本地时间。
 *
 * 构建对象的方式:
 * 1、public static XXXX now(); 静态方法,根据当前时间创建对象
 * 例如:LocaDate LocaDate = LocaDate.now();
 * 2、public static XXXX of(...); 静态方法,指定日期/时间创建对象
 * 例如:LocaDate LocaDate = LocaDate.of(2009,11,11);
 *
 * 修改相关API:
 * plusDays,plusWeeks,plusMonths,plusYears  :向当前LocalDate对象添加几天、几周、几月、几年。
 * minusDays,minusWeeks,minusMonths,minusYears :从当前LocalDate对象减去几天、几周、几月、几年。
 * withDayOfMonth,withDayOfYear,withDayOfMonth,withYear :将月份天数、年份天数、月份、年份修改为指定的值并返回新的localDate对象
 * isBefore,isAfter :比较两个LocalDate
 */
public class time_Test {
    public static void main(String[] args) {
        LocalTime nowTime = LocalTime.now();
        System.out.println(nowTime);
        System.out.println(nowTime.minusHours(1));//一个小时前
        System.out.println(nowTime.plusHours(1));//一个小时后
​
        System.out.println("-----------------------");
        LocalTime myDate = of(2018,9,5);
        LocalTime nowDate = LocalTime.now();
        System.out.println("今天是2018-09-06吗?" + nowDate.equals(myDate));
        System.out.println(myDate+"是否在"+nowDate+"之前?"+myDate.isBefore(nowDate));
        System.out.println(myDate+"是否在"+nowDate+"之后?"+myDate.isAfter(nowDate));
        System.out.println("-------------------");
        //判断今天是否是你的生日?
        LocalDate birDate = LocalDate.of(2002,12,12);
        LocalDate nowDate1 = LocalDate.now();
​
        MonthDay birMD = MonthDay.of(birDate.getMonthValue(),birDate.lengthOfMonth());
        MonthDay nowMD = MonthDay.from(nowDate1);
        System.out.println("今天是你的生日吗?"+birMD.equals(nowMD));
​
​
        //时间戳:Instant
        Instant instant = Instant.now();
        System.out.println("当前时间戳是:"+instant);
​
        Date date = Date.from(instant);
        System.out.println("当前时间戳是:"+date);
​
        instant = date.toInstant();
        System.out.println(instant);
​
        // DateTimeFormatter 用于做时间的格式化和解析的
        LocalDateTime ldt = LocalDateTime.now();
        System.out.println(ldt);
        // 解析/格式化器
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss EEE a");
        //正向格式化 :格式化器格式日期
        System.out.println(dtf.format(ldt));
        //逆向格式化 : 日期格式 格式化器
        System.out.println(ldt.format(dtf));
        //解析字符串时间
        DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        String dateStr ="2019-11-12 11-11-11";
        //解析当前字符串成为本地日期时间对象
        LocalDateTime ldt1 = LocalDateTime.parse("2019-11-12 11:11:11",dtf1);
        System.out.println(ldt1);
​
        System.out.println(ldt1.getDayOfYear());
​
        //period :用于计算两个日期间隔  ,只能精确到年月日(java.time.period)
        //当前年月日
        LocalDate today=LocalDate.now();
        System.out.println(today);
        //生日的年月日
        LocalDate birthDate = LocalDate.of(1998,10,12);
        System.out.println(birthDate);
​
        Period period = Period.between(birthDate,today);
        System.out.println(period.getYears());
        System.out.println(period.getMonths());
        System.out.println(period.getDays());
​
        //Duration :用于计算两个时间间隔
        LocalDateTime today1 =LocalDateTime.now();
        System.out.println(today1);
​
        //生日的年月日
        LocalDateTime birthDate1 = LocalDateTime.of(1998,10,12,20,00,00);
        System.out.println(birthDate1);
​
        Duration duration = Duration.between(today1,birthDate1);//第二个参数减第一个参数
        System.out.println(duration.toDays());//两个时间的天数
        System.out.println(duration.toHours());//两个时间差的小时数
        System.out.println(duration.toMinutes());//两个时间差的分钟数
        System.out.println(duration.toMillis());//两个时间差的毫秒数
        System.out.println(duration.toNanos());//两个时间差的秒数
    }
}

三、Instant时间戳

1.概述:

        JDK8获取时间戳特别简单,且功能更丰富。Instant类由一个静态的工厂方法now()可以返回当前时间戳。

 

        时间戳是包含日期和时间的,与java.util.Date很类似,事实上Instant就是类似JDK8以前的Date。

        Instant和Date这两个类可以进行转换。

2.代码演示:

import java.time.Instant;
import java.time.ZoneId;
import java.util.Date;
​
public class Instant_Test {
    public static void main(String[] args) {
        //时间戳:Instant
        Instant instant = Instant.now();
        System.out.println("当前时间戳是:"+instant);
​
        Date date = Date.from(instant);
        System.out.println("当前时间戳是:"+date);
​
        instant = date.toInstant();
        System.out.println(instant);
        //2.系统此刻的时间戳怎么办?
        Instant instant1 = Instant.now();
        System.out.println(instant1.atZone(ZoneId.systemDefault()));
        //3.如何转成Date对象
        Date date1 = Date.from(instant);
        System.out.println("当前时间戳是:"+date);
    }
}

四、DateTimeFormatter类

1.概述:

        在JDK8中,引入了一个全新的日期与时间格式器DateTimeFormatter。

        正反都能调用format方法。

 

2.代码演示:

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
​
public class DateTmeFormatter_Test {
    public static void main(String[] args) {
        // DateTimeFormatter 用于做时间的格式化和解析的
        LocalDateTime ldt = LocalDateTime.now();
        System.out.println(ldt);
        // 解析/格式化器
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss EEE a");
        //正向格式化 :格式化器格式日期
        System.out.println(dtf.format(ldt));
        //逆向格式化 : 日期格式 格式化器
        System.out.println(ldt.format(dtf));
        //解析字符串时间
        DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        String dateStr ="2019-11-12 11-11-11";
        //解析当前字符串成为本地日期时间对象
        LocalDateTime ldt1 = LocalDateTime.parse("2019-11-12 11:11:11",dtf1);
        System.out.println(ldt1);
​
        System.out.println(ldt1.getDayOfYear());
    }
}

五、Duration/Period类

1.Period概述:

        在java8中,我们可以使用以下类来计算日期间隔差异:java.time.Period

        主要是Period类方法getYear(),getMonths()和getDays()来计算,只能精确到年月日。

        用于LocalDate之间的比较。

  

2.代码演示:

import java.time.LocalDate;
import java.time.Period;
​
public class Period_Test {
    public static void main(String[] args) {
        //period :用于计算两个日期间隔  ,只能精确到年月日(java.time.period)
        //当前年月日
        LocalDate today =LocalDate.now();
        System.out.println(today);
        //生日的年月日
        LocalDate birthDate = LocalDate.of(1998,10,12);
        System.out.println(birthDate);
​
        Period period = Period.between(birthDate,today);
        System.out.println(period.getYears());
        System.out.println(period.getMonths());
        System.out.println(period.getDays());
    }
}

3.Duration概述:

        在java8中,我们可以使用以下类来计算日期间隔差异:java.time.Duration

        提供了使用基于时间的值测量时间量的方法。

        用于LocalDateTime之间的比较,也可用于Instant之间的比较。

 

4.代码演练:

import java.time.Duration;
import java.time.LocalDateTime;
​
public class Duration_Test {
    public static void main(String[] args) {
        //Duration :用于计算两个时间间隔
        LocalDateTime today1 =LocalDateTime.now();
        System.out.println(today1);
        //生日的年月日
        LocalDateTime birthDate1 = LocalDateTime.of(1998,10,12,20,00,00);
        System.out.println(birthDate1);
​
        Duration duration = Duration.between(birthDate1,today1);//第二个参数减第一个参数
        System.out.println(duration.toDays());//两个时间的天数
        System.out.println(duration.toHours());//两个时间差的小时数
        System.out.println(duration.toMinutes());//两个时间差的分钟数
        System.out.println(duration.toMillis());//两个时间差的毫秒数
        System.out.println(duration.toNanos());//两个时间差的秒数
    }
}

六、ChronoUnit类

1.概述:

        java.time.temporal.ChronoUnit

        ChronoUnit类可用于在单个时间单位内测量一段时间,这个工具类是最全的,可以用于比较所有的时间单位。

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

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

相关文章

ctfshow学习记录-web入门(sql注入191-200)

目录web191web192web193web194web195web196web197web198web199web200九某人来更新啦:2023年第一篇wp新鲜出炉~ web191 解答:增加了过滤 过滤了ascii,可以用ord方法代替。(这里手册中也有告知~) web190的pa…

【数据结构与算法】Trie

😀大家好,我是白晨,一个不是很能熬夜😫,但是也想日更的人✈。如果喜欢这篇文章,点个赞👍,关注一下👀白晨吧!你的支持就是我最大的动力!&#x1f4…

集合引用类型 下

目录 Map Map.set() Map.get() Map.delete() Map.has() Map.values() Map.entries() Map.clear() 选择Object 还是Map 数据转换 转为数组 转为 JSON 对象转为 Map 数组转为 Map 转为Object WeakMap 基本API 弱键 不可迭代 Set 创建Set实例 Set实例转数组 si…

STM32-启动文件详解

✅作者简介:嵌入式入坑者,与大家一起加油,希望文章能够帮助各位!!!! 📃个人主页:rivencode的个人主页 🔥系列专栏:玩转FreeRTOS 💬推荐…

python基础篇之数字类型(下)

大家好,我是csdn的博主:lqj_本人 这是我的个人博客主页:lqj_本人的博客_CSDN博客-微信小程序,前端,vue领域博主lqj_本人擅长微信小程序,前端,vue,等方面的知识https://blog.csdn.net/lbcyllqj?spm1000.2115.3001.5343 哔哩哔哩欢迎关注&…

在vue2使用百度脑图的kityminder-core进行二次开发思维导图,在源码中添加新的命令

需求说明:最近在搞kityminder-core的思维导图,需要增加一个给节点添加文件的功能,一直在研究源码,发现都是通过执行命令的方式实现的。一直卡在新增命令的步骤,搞了好多天了今天找到了如何在源码里新增命令&#xff0c…

leetcode 1807. 替换字符串中的括号内容【python3双指针+哈希表】实现过程分析以及思路整理

题目 给你一个字符串s,它包含一些括号对,每个括号中包含一个非空的键。 比方说,字符串"(name)is(age)yearsold"中,有两个括号对,分别包含键"name"和"age"。 你知道许多键对应的值&…

android实现侧边栏:解决header控件无法操作和底部menuitem点击无效的问题

1:目录结构:(源码和总结都放在b站,链接在底部) 2:实现的大概逻辑: 使用drawerlayout抽屉布局实现,并使用navigationview加载头部和底部 3:核心问题一:header…

用Python来创建7种不同的文件格式

用Python来创建7种不同的文件格式一、用Python来创建7种不同的文件格式1.1、文本文件1.2、CSV文件1.3、Excel文件1.4、压缩文件1.5、XML文件1.6、JSON文件1.7、PDF文件一、用Python来创建7种不同的文件格式 1.1、文本文件 写入 file_name "my_text_file.txt"# 将…

微信小程序——WXML模板语法-条件渲染,列表渲染

一.条件渲染1.wx:if在小程序中,使用wx:if"{{condition}}"来判断是否需要渲染该代码块:也可以用wx:elif和wx:else来添加else判断:实例如下:1.在js文件中定义一个typedata:{type:1 },此时虚拟页面上显示的就是&#xff1a…

二十四、Kubernetes中Deployment(Deploy)控制器详解

1、概述 在kubernetes中,有很多类型的pod控制器,每种都有自己的适合的场景,常见的有下面这些: ReplicationController:比较原始的pod控制器,已经被废弃,由ReplicaSet替代 ReplicaSet&#xff…

kafka/bin/kafka-run-class.sh: line 342: exec: java: not found

本来jps看了下,kafka和zookeeper都起来了,手痒,非要换宝塔的进程守护管理器,选目录为/home/kafka,命令为/home/kafka/bin/zookeeper-server-start.sh /home/kafka/config/zookeeper.properties 就在日志里看到 kafk…

马蹄集 整除的总数

整除的总数 难度&#xff1a;白银 时间限制&#xff1a;1秒 巴占用内存&#xff1a;64M 输入正整数N和M,其中N<M。求区间[N,M]中可被K整除的总数。 格式 输入格式&#xff1a;输入正整数N,M和K,空格分隔。 输出格式&#xff1a;输出整型 #include <bits/stdc.h&g…

RabbitMQ(二)使用Docker安装

目录1. 拉取 RabbitMQ 镜像2.启动 RabbitMQ 容器3.查看 RabbitMQ 是否启动官网地址&#xff1a;https://www.rabbitmq.com/ 下载地址&#xff1a;https://www.rabbitmq.com/download.html 这篇文章为了方便初学者入门&#xff0c;在 linux 环境下用 docker 直接安装 RabbitMQ&…

【JavaSE】String相关知识

String \ StringBuilder \ StringBufferString的值是不可变的&#xff0c;使用“”或者“”的方法尝试改变String的值并不是在原本的基础上修改&#xff0c;而是赋值给了新的字符串常量引用StringBuffer是线程安全的&#xff0c;使用的是无脑加synchronized的方法这三者的运行速…

10分钟上手一款好用的服务器节点监测工具(Server 酱)

Server 酱简介 Server酱&#xff0c;英文名「ServerChan」&#xff0c;是一款「手机」和「服务器」、「智能设备」之间的通信软件。说人话&#xff1f;就是从服务器、路由器等设备上推消息到手机的工具。开通并使用上它&#xff0c;只需要一分钟&#xff1a; 微信扫码登入设置…

Mysql可视化软件-Navicat和SQLyog

Navicat 可以将mysql可视化的一个软件 可以避免一直在命令行里面敲代码&#xff0c;很难绷 连接 密码写一个你能记住的&#xff0c;不然打不开连接 对应的IP可以是localhost或者127.0.0.1 都是本机 端口号就我们在my.ini写的那个 然后进行我们上面说的操作-新建一个数据库先…

Linux操作系统常用命令

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;Java案例分…

【uniapp】记录地址管理页面

uniapp中的地址管理页面 <template><view class"container"><view class"oldaddress" v-for"(item,index) in cardInfo" :key"index"><view class"topview"><view class"name">{{i…

线缆行业单绞机控制算法(详细图解+代码)

在了解单绞机之前需要大家对收放卷以及排线控制有一定的了解,不清楚的可以参看下面几篇博客,这里不再赘述,受水平和能力所限,文中难免出现错误和不足之处,诚恳的欢迎大家批评和指正。 收放卷行业开环闭环控制算法 PLC张力控制(开环闭环算法分析)_RXXW_Dor的博客-CSDN博…