java获取当前时间的方法:LocalDateTime、Date、Calendar,以及三者的比较

news2024/11/28 14:53:38

文章目录

  • 前言
  • 一、LocalDateTime
    • 1.1 获取当前时间LocalDate.now()
    • 1.2 获取当前时间的年、月、日、时分秒localDateTime.getYear()……
    • 1.3 给LocalDateTime赋值LocalDateTime.of()
    • 1.4 时间与字符串相互转换LocalDateTime.parse()
    • 1.5 时间运算——加上对应时间LocalDateTime.now().plusYears(2)
    • 1.6 时间运算——减去对应时间LocalDateTime.now().minusYears(2)
    • 1.7 两个时间比较LocalDateTime.now().compareTo()
    • 1.8 利用Duration计算时间差Duration.between(of,now).toMillis()
    • 1.9 改变当前时间的年、月、日、时、分、秒LocalDateTime.now().withYear(2060)
    • 1.10 自定义输出的格式DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
    • 1.11 LocalDateTime的with()方法
    • 1.12 两个日期前后的比较与判断LocalDateTime.now().isBefore()
  • 二、Util获取当前时间
    • 2.1 Date
    • 2.1.1 Date获取当前时间
    • 2.1.1 Date存在的缺陷
    • 2.2 Calendar
  • 三、System.currentTimeMillis()
  • 总结


前言


在开发时我们经常需要获取当前时间或者对时间进项处理(在某个时间的基础上增加或者减少),java获取时间的方法比较多,有LocalDateTime、Date、Calendar等,其中LocalDateTime是java8的新特性,相比较其它两个而言,LocalDateTime有很多优势,这也是最推荐使用的方法。
下面我们先来介绍一个LocalDateTime的用法,然后介绍Date、Calendar的用法,最后比较它们的区别。

一、LocalDateTime

JDK1.8版本中新引入的API,加强了对时间的管理,有很多特别好用的时间运算方法,而且是线程安全的。

1.1 获取当前时间LocalDate.now()

    @Test
    void test() {
        LocalDate localDate = LocalDate.now();
        LocalTime localTime = LocalTime.now();
        LocalDateTime localDateTime = LocalDateTime.now();
        System.out.println("localDate:"+localDate);//2023-02-22
        System.out.println("localTime:"+localTime);//17:25:36.590
        System.out.println("localDateTime:"+localDateTime);//2023-02-22T17:25:36.590
    }

输出结果:
在这里插入图片描述
可以看到不用做格式转换就可以得到可读性很高的日期格式。
注意:ISO 8601规定的日期和时间分隔符是T。标准格式如下:

日期:yyyy-MM-dd
时间:HH:mm:ss
带毫秒的时间:HH:mm:ss.SSS
日期和时间:yyyy-MM-dd'T'HH:mm:ss
带毫秒的日期和时间:yyyy-MM-dd'T'HH:mm:ss.SSS

1.2 获取当前时间的年、月、日、时分秒localDateTime.getYear()……

    @Test
    void test() {
        LocalDateTime localDateTime = LocalDateTime.now(); // 获取当前时间
        int year = localDateTime.getYear(); // 获取年份 2023
        int month = localDateTime.getMonthValue(); // 获取月份 2
        int day = localDateTime.getDayOfMonth(); // 获取月中的天数 22
        int hour = localDateTime.getHour(); // 获取当前的小时 17
        int minute = localDateTime.getMinute(); // 获取当前分钟 33
        int second = localDateTime.getSecond(); // 获取当前秒数 22
        System.out.println(year);
        System.out.println(month);
        System.out.println(day);
        System.out.println(hour);
        System.out.println(minute);
        System.out.println(second);
    }

输出结果:
在这里插入图片描述

1.3 给LocalDateTime赋值LocalDateTime.of()

    void test() {
        LocalDateTime of = LocalDateTime.of(2023,2,22,22,22,22);
        System.out.println(of); // 输出2023-02-22T22:22:22
    }

输出结果:
在这里插入图片描述

1.4 时间与字符串相互转换LocalDateTime.parse()

    @Test
    void test() {
        // 将字符串转换为指定格式的时间(格式要和给定的格式一致,不然会报错)
        LocalDateTime parse = LocalDateTime.parse("2023-02-22 22:22:22", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        LocalDateTime parse1 = LocalDateTime.parse("2023 02 22 22:22:22", DateTimeFormatter.ofPattern("yyyy MM dd HH:mm:ss"));
        LocalDateTime parse2 = LocalDateTime.parse("2023.02.22 22:22:22", DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm:ss"));
        System.out.println(parse); // 输出2023-02-22T22:22:22
        System.out.println(parse1); // 输出2023-02-22T22:22:22
        System.out.println(parse2); // 输出2023-02-22T22:22:22
        // 时间转字符串
        LocalDateTime now = LocalDateTime.now();
        DateTimeFormatter of = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        String dateTime = now.format(of);
        System.out.println(dateTime); // 输出 2023-02-22 17:56:18
    }

输出结果:
在这里插入图片描述

1.5 时间运算——加上对应时间LocalDateTime.now().plusYears(2)

LocalDateTime提供了对日期和时间进行加减的非常简单的链式调用,让时间运算变得非常简单:

    @Test
    void test() {
        LocalDateTime now = LocalDateTime.now(); // 当前时间2023-02-22T18:00:19.352
        LocalDateTime plusYears= now.plusYears(2); // 在当前时间加上2年2025-02-22T18:00:19.352
        LocalDateTime plusMonths= now.plusMonths(2);// 在当前时间商加上2月2023-04-22T18:00:19.352
        LocalDateTime plusDays= now.plusDays(2); // 在当前时间加上2天2023-02-24T18:00:19.352
        LocalDateTime plusHours= now.plusHours(2); // 在当前时间加上2个小时2023-02-22T20:00:19.352
        LocalDateTime plusMinutes= now.plusMinutes(30); // 在当前时间加上30分钟2023-02-22T18:30:19.352
        LocalDateTime plusSeconds = now.plusSeconds(30); // 在当前时间加上30秒2023-02-22T18:00:49.352
        System.out.println(now);
        System.out.println(plusYears);
        System.out.println(plusMonths);
        System.out.println(plusDays);
        System.out.println(plusHours);
        System.out.println(plusMinutes);
        System.out.println(plusSeconds);
    }

输出结果:
在这里插入图片描述

1.6 时间运算——减去对应时间LocalDateTime.now().minusYears(2)

    @Test
    void test() {
        LocalDateTime now = LocalDateTime.now(); // 当前时间
        LocalDateTime minusYears = now.minusYears(2); // 在当前时间减上2年
        LocalDateTime minusMonths = now.minusMonths(2);// 在当前时间商减上2月
        LocalDateTime minusDays = now.minusDays(2); // 在当前时间减上2天
        LocalDateTime minusHours = now.minusHours(2); // 在当前时间减上2个小时
        LocalDateTime minusMinutes = now.minusMinutes(30); // 在当前时间减上30分钟
        LocalDateTime minusSeconds = now.minusSeconds(30); // 在当前时间减上30秒
        System.out.println("now:" + now);
        System.out.println("minusYears:" + minusYears);
        System.out.println("minusMonths:" + minusMonths);
        System.out.println("minusDays:" + minusDays);
        System.out.println("minusHours:" + minusHours);
        System.out.println("minusMinutes:" + minusMinutes);
        System.out.println("minusSeconds:" + minusSeconds);
    }

输出结果:
在这里插入图片描述

1.7 两个时间比较LocalDateTime.now().compareTo()

    @Test
    void test() {
        LocalDateTime now = LocalDateTime.now(); // 当前时间
        LocalDateTime now1 = now.plusYears(5); // 在当前时间加上5年
        //  给LocalDateTime 赋值
        LocalDateTime of = LocalDateTime.of(2023,2,2,22,22,22);
        LocalDateTime of1 = LocalDateTime.of(2023,8,5,1,1,1);
        //两个时间作比较,第一个时间减去第二个时间(如果年份相同,比较月份,月份相同比较天数,以此类推)
        int compareTo = now1.compareTo(now);
        int compareTo1 = now.compareTo(now1);
        int compareTo2 = now.compareTo(of);
        int compareTo3 = now.compareTo(of1);
        System.out.println(now);   // 输出 2023-02-22T20:19:44.112v
        System.out.println(now1); // 输出 2028-02-22T20:19:44.112
        System.out.println(of); // 输出 2023-02-02T22:22:22
        System.out.println(of1); // 输出 2023-08-05T01:01:01
        System.out.println(compareTo); // 输出 5
        System.out.println(compareTo1); // 输出 -5
        System.out.println(compareTo2); // 输出 20
        System.out.println(compareTo3); // 输出 -6
    }

输出结果:

1.8 利用Duration计算时间差Duration.between(of,now).toMillis()

注意没有计算相差的年和秒值,对于要计算相差的秒数,可以利用计算毫秒来进行转换。

    @Test
    void test() {
        LocalDateTime now = LocalDateTime.now(); // 当前时间
        //  给LocalDateTime 赋值
        LocalDateTime of = LocalDateTime.of(2022,2,22,2,2,2);
        Duration duration = Duration.between(of,now); // 后面减去前面
        long toDays = Duration.between(of,now).toDays(); //相差的天数
        long toHours = Duration.between(of,now).toHours();//相差的小时数
        long toMinutes = Duration.between(of,now).toMinutes();//相差的分钟数
        long toMillis = Duration.between(of,now).toMillis();//相差毫秒数
        long toNanos = Duration.between(of,now).toNanos();//相差的纳秒数
        System.out.println("toDays:"+ toDays); // 输出 toDays:365
        System.out.println("toHours:"+ toHours); // 输出 toHours:8778
        System.out.println("toMinutes:"+ toMinutes); // 输出 toMinutes:526732
        System.out.println("toMillis:"+ toMillis); // 输出 toMillis:31603973840
        System.out.println("toNanos:"+ toNanos); // 输出 toNanos:31603973840000000
    }

输出结果:
在这里插入图片描述

1.9 改变当前时间的年、月、日、时、分、秒LocalDateTime.now().withYear(2060)

    @Test
    void test() {
        LocalDateTime now = LocalDateTime.now(); // 当前时间
        LocalDateTime withYear = now.withYear(2060); // 改变当前年份(变成2060年)
        LocalDateTime withMonth = now.withMonth(12); // 改变当前月份(变成12月份)
        LocalDateTime withDayOfMonth = now.withDayOfMonth(28); //改变当前天数(变成28日)
        LocalDateTime withHour = now.withHour(23); // 改变当前小时数(变成23时)
        LocalDateTime withMinute = now.withMinute(30); // 改变当前分钟(变成30分钟)
        LocalDateTime withSecond = now.withSecond(23); // 改变当前小时数(变成23时)
        LocalDateTime withDayOfYear = now.withDayOfYear(60); // 从一月一号开始加上60天
        System.out.println(now);
        System.out.println("withYear:"+ withYear);
        System.out.println("withMonth:"+ withMonth);
        System.out.println("withDayOfMonth:"+ withDayOfMonth);
        System.out.println("withHour:"+ withHour);
        System.out.println("withMinute:"+ withMinute);
        System.out.println("withSecond:"+ withSecond);
        System.out.println("withDayOfYear:"+ withDayOfYear);
    }

输出结果:
在这里插入图片描述

1.10 自定义输出的格式DateTimeFormatter.ofPattern(“yyyy/MM/dd HH:mm:ss”);

    @Test
    void test() {
        // 自定义格式化:
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
        DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm:ss");
        System.out.println("自定义格式yyyy/MM/dd HH:mm:ss :"+dtf.format(LocalDateTime.now()));
        System.out.println("自定义格式yyyy.MM.dd HH:mm:ss :"+dtf1.format(LocalDateTime.now()));

        // 用自定义格式解析:
        LocalDateTime dt2 = LocalDateTime.parse("2020/10/20 15:16:17", dtf);
        System.out.println("格式解析:"+dt2);
    }

输出结果:
在这里插入图片描述

1.11 LocalDateTime的with()方法

// 本月第一天0:00时刻:
LocalDateTime firstDay = LocalDate.now().withDayOfMonth(1).atStartOfDay();
// 本月最后1天:
LocalDate lastDay = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth());
// 下月第1天:
LocalDate nextMonthFirstDay = LocalDate.now().with(TemporalAdjusters.firstDayOfNextMonth());
// 本月第1个周一:
LocalDate firstWeekday = LocalDate.now().with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY));

输出结果:

1.12 两个日期前后的比较与判断LocalDateTime.now().isBefore()

    @Test
    void test() {
        //判断两个时间点的前后
        LocalDateTime now = LocalDateTime.now();
        LocalDateTime target = LocalDateTime.of(2022, 2, 22, 22, 22, 22);
        boolean isBefore = now.isBefore(target);
        System.out.println("now:"+now);
        System.out.println("target:"+target);
        System.out.println("isBefore:"+isBefore);
        System.out.println(LocalDate.now().isBefore(LocalDate.of(2022, 2, 22)));
        System.out.println(LocalTime.now().isAfter(LocalTime.parse("08:15:00")));
    }
    }

输出结果:
在这里插入图片描述

二、Util获取当前时间

2.1 Date

2.1.1 Date获取当前时间

    @Test
    void test() {
        Date date = new Date(); // 返回当前时间戳格式
        SimpleDateFormat dateFormat= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 改变格式
        System.out.println(dateFormat.format(date)); // 获取当前时间  2023-02-22 21:24:53
    }

2.1.1 Date存在的缺陷

如果不格式化,打印出的日期可读性差:

    @Test
    void test() {
        Date date = new Date(); // 返回当前时间戳格式
        System.out.println(date); // 获取当前时间  Wed Feb 22 21:34:18 CST 2023
    }

通常会使用SimpleDateFormate来实现格式化,但是sdf最大的问题是线程不安全的。

2.2 Calendar

    @Test
    void test() {
        Calendar cal= Calendar.getInstance(); // 返回当前时间戳格式
        SimpleDateFormat dateFormat= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 改变格式
        System.out.println(dateFormat.format(cal.getTime())); // 获取当前时间
        int y=cal.get(Calendar.YEAR); // 获取当前年份
        int m=cal.get(Calendar.MONTH); // 获取当前月份
        int d=cal.get(Calendar.DATE); // 获取当前日期
        int h=cal.get(Calendar.HOUR_OF_DAY); // 获取当前小时
        int mi=cal.get(Calendar.MINUTE); // 获取当前分钟
        int s=cal.get(Calendar.SECOND); // 获取当前秒数
        System.out.println("现在时刻是"+y+"年"+m+"月"+d+"日"+h+"时"+mi+"分"+s+"秒");
    }

三、System.currentTimeMillis()

SimpleDateFormat formatter= new SimpleDateFormat("yyyy-MM-dd 'at' HH:mm:ss z"); // 改变格式
Date date = new Date(System.currentTimeMillis()); // 返回当前时间戳格式
System.out.println(formatter.format(date)); // 获取当前时间


总结

LocalDateTime获取时间以及计算都非常方便,而且是线程安全的,简易使用LocalDateTime。

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

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

相关文章

SEO让Web3的需求更符合用户意图,AI+SEO充满想象

Web3 的基础设施建设现在仍处于前期,并没有出现现象级落地应用可以直接进入Web3,平常学习和交流中的大量信息和需求也只能通过传统互联网或智能手机作为端口,在企业浏览器和网站中寻找机会,这其中如何使企业品牌和原创内容能更好更靠前的呈现…

浅谈ffmpeg 压缩视频

1 首选需要安装ffmpeg 安装ffmpeg Linux 宝塔面板安装FFMpeg和编码库 yum install https://download1.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm yum install http://rpmfind.net/linux/epel/7/x86_64/Packages/s/SDL2-2.0.14-2.el7.x86_64.rpm yum install …

【以太坊知识】

以太坊知识一、信标链引入1、内容2、合并二、二层网络与一层网络1、概念2、关系3、二层网络的工作原理三、分片1、概念2、分片特性一、信标链引入 1、内容 2022 年 9 月 15 日完成合并升级,将权益证明正式确定为太坊的共识机制。信标链是2020年启动的第一条权益证…

ubuntu 22.04 版本如何安装NCL

ubuntu 22.04 版本如何安装NCL 最近,重新创建了一个linux子系统进行学习。在安装ncl的时候,出现了各种问题。特此记录一下解决的过程。 首先下载了NCL的Linux版本的安装包,进行解压以及环境配置。但是在测试是否安装成功时,出现…

Linux部署java项目

Linux部署java项目启动虚拟机这部分的操作之前学习虚拟机时已经做过,可以参照之前的笔记即可推荐大家重新解压纯净版的RockyLinux来实现启动后登录rockylinuxsudo su -修改root用户密码passwd下面就切换到客户端软件连接虚拟机ifconfigifconfig | more查看ip地址使用Bvssh软件连…

如何判断机器学习数据集是否是线性的

首先,线性和非线性函数之间的区别: 左边是线性函数,右边是非线性函数。 线性函数:可以简单定义为始终遵循以下原则的函数: 输入/输出=常数。 线性方程总是1次多项式(例如x+2y+3=0)。在二维情况下,它们总是形成直线;在其他维度中,它们也可以形成平面、点或超平面。它们的…

追梦之旅【数据结构篇】——详解C语言实现动态版顺序栈

详解C语言动态实现顺序栈~😎前言🙌预备小知识💞栈的概念及结构整体实现内容分析💞1.头文件编码实现🙌2.功能文件编码实现🙌3.测试文件的编写:🙌总结撒花💞😎博…

ToB 产品拆解—Temu 商家管理后台

Temu 是拼多多旗下的跨境电商平台,平台产品于9月1日上线,9月1日到9月15日为测试期,之后全量全品类放开售卖。短短几个月的时间,Temu 在 App Store 冲上了购物类榜首,引起了国内的广泛关注。本文将以 B 端产品经理的角度…

opencv图片处理

目录1 图片处理1.1 显示图片1.2 旋转图片1.3 合并图片1.4、Mat类1.4.1、像素的储存结构1.4.2、访问像素数据1.6、rgb转灰度图1.7、二值化1.8、对比度和亮度1.9、图片缩放1.9.1、resize临近点算法双线性内插值1.9.2、金字塔缩放1.10、图片叠加1 图片处理 1.1 显示图片 #includ…

系统架构——分布式架构负载均衡系统设计实战

摘要 关于“负载均衡”的解释,百度词条里:负载均衡,英文叫Load Balance,意思就是将请求或者数据分摊到多个操作单元上进行执行,共同完成工作任务。负载均衡(Load Balance)建立在现有网络结构之…

HTTP2.0特性

HTTP2.0特性1. 二进制分帧1.1 关于帧的知识1.2 什么是二进制分帧1.3 二进制分帧如何工作1.4 二进制分帧对性能优化工作的贡献2. 首部压缩2.1 什么是首部压缩2.2 首部压缩如何工作2.3 首部压缩性能优化工作的贡献3. 流量控制4. 多路复用4.1 什么是多路复用4.2 多路复用如何工作4…

Another FasterRunner接口自动化测试平台

基于httprunner的接口自动化测试平台体验地址:http://119.91.147.215/fastrunner/login 操作手册https://www.yuque.com/lihuacai/fasterunner/wn5ync整体架构功能项目管理API模板支持添加接口和从yapi导入接口。同时支持接口调试。其中的提取,验证&…

【java基础】java八大基本数据类型和运算符

文章目录说明八大基本数据类型整型浮点型字符型布尔类型类型转换java运算符基础运算符二元运算符自增自减运算符关系和boolean运算符三元运算符位运算符运算符优先级说明 这里介绍java的八大基本数据类型和运算符 八大基本数据类型 java中有八大数据类型,4个整型…

PTA L1-054 福到了(详解)

前言:内容包括:题目,代码实现,大致思路,代码解读 题目: “福”字倒着贴,寓意“福到”。不论到底算不算民俗,本题且请你编写程序,把各种汉字倒过来输出。这里要处理的每…

Endless lseek导致的SQL异常

最近碰到同事咨询的一个问题&#xff0c;在执行一个函数时&#xff0c;发现会一直卡在那里。 strace抓了下发现会话一直在执行lseek&#xff0c;大致情况如下&#xff1a; 16:13:55.451832 lseek(33, 0, SEEK_END) 1368064 <0.000037> 16:13:55.477216 lseek(33, 0, SE…

Gluten 首次开源技术沙龙成功举办,更多新能力值得期待

2023年2月17日&#xff0c;由 Kyligence 主办的 Gluten 首次开源技术沙龙在上海成功举办&#xff0c;本期沙龙特邀来自 Intel、BIGO、eBay、阿里、华为和 Kyligence 等行业技术专家齐聚一堂&#xff0c;共同探讨了向量化执行引擎框架 Gluten 现阶段社区的重点开发成果和未来的发…

MapBox动态气泡图渲染教程

先来看效果: 视频效果: 屏幕录制2023-02-22 15.34.57 首先我们来介绍一下思路。对于mapbox和openlayers这样的框架来讲,气泡图中的气泡本质上就是一个div,就是将一个dom元素追加到canvas上的固定位置而已。 在mapbox中有marker的概念,官网也有示例: Attach a popup to …

如何实现Delta并联机械臂搬运磁铁物料?

1. 功能说明 利用Delta并联机械臂实现不同点定点搬运磁铁物料的效果。 2. 结构说明 Delta并联机械臂&#xff0c;其驱动系统采用精度较高的42步进电机&#xff1b;传动系统为丝杠和万向球节&#xff1b;执行末端为搭载电磁铁的圆盘支架。 3. Delta机械臂运动学算法 这里给大…

【3】linux命令每日分享——mv改名或移动

大家好&#xff0c;这里是sdust-vrlab&#xff0c;Linux是一种免费使用和自由传播的类UNIX操作系统&#xff0c;Linux的基本思想有两点&#xff1a;一切都是文件&#xff1b;每个文件都有确定的用途&#xff1b;linux涉及到IT行业的方方面面&#xff0c;在我们日常的学习中&…