Java基础(十七):日期时间API

news/2025/2/15 5:40:14/

Java基础系列文章

Java基础(一):语言概述

Java基础(二):原码、反码、补码及进制之间的运算

Java基础(三):数据类型与进制

Java基础(四):逻辑运算符和位运算符

Java基础(五):流程控制语句

Java基础(六):数组

Java基础(七):面向对象编程

Java基础(八):封装、继承、多态性

Java基础(九):Object 类的使用

Java基础(十):关键字static、代码块、关键字final

Java基础(十一):抽象类、接口、内部类

Java基础(十二):枚举类

Java基础(十三):注解(Annotation)

Java基础(十四):包装类

Java基础(十五):异常处理

Java基础(十六):String的常用API

Java基础(十七):日期时间API


目录

  • 一、JDK8之前:日期时间API
    • 1、java.lang.System类的方法
    • 2、两个Date类
    • 3、java.text.SimpleDateFormat
    • 4、java.util.Calendar(日历)
  • 二、JDK8:新的日期时间API
    • 1、为什么会有新的时间API
    • 2、本地日期时间:LocalDate、LocalTime、LocalDateTime
    • 3、瞬时:Instant
    • 4、日期时间格式化:DateTimeFormatter
  • 三、与传统日期处理的转换


一、JDK8之前:日期时间API

1、java.lang.System类的方法

  • System类提供的public static long currentTimeMillis()
    • 获取当前时间对应的毫秒数,long类型,时间戳
    • 当前时间与1970年1月1日0时0分0秒之间的毫秒数
    • 此方法适于计算时间差

举例:

@Test
public void test1(){long time = System.currentTimeMillis();System.out.println(time);//1559806982971//当前系统时间距离1970-1-1 0:0:0 0毫秒的时间差,毫秒为单位
}

2、两个Date类

java.util.Date

  • 表示特定的瞬间,精确到毫秒
  • 构造器:
    • Date():使用无参构造器创建的对象可以获取本地当前时间
    • Date(long 毫秒数):把该毫秒值换算成日期时间对象
  • 常用方法:
    • getTime(): 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数
    • toString(): 把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy
      • 其中: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat),zzz是时间标准
    • 其它很多方法都过时了

举例:

@Test
public void test2(){Date date1 = new Date(); //创建一个基于当前系统时间的Date的实例System.out.println(date1.toString());//Mon Dec 05 11:56:26 CST 2022long milliTimes = date1.getTime();System.out.println("对应的毫秒数为:" + milliTimes); //1670212256045Date date2 = new Date(1370202256045L); //创建一个基于指定时间戳的Date的实例System.out.println(date2.toString());
}

java.sql.Date

  • java.util.Date是java.sql.Date的父类
  • java.sql.Date: 对应着数据库中的date类型
  • 没有空参构造方法,只有年月日,没有时分秒
@Test
public void test2(){java.sql.Date date1 = new java.sql.Date(1370202256045L);System.out.println(date1.toString());//2013-06-03System.out.println(date1.getTime());//1370202256045
}

3、java.text.SimpleDateFormat

  • java.text.SimpleDateFormat类是一个不与语言环境有关的方式来格式化和解析日期的具体类
  • 可以进行格式化:日期 --> 文本
  • 可以进行解析:文本 --> 日期
  • 构造器:
    • SimpleDateFormat() :默认的模式和语言环境创建对象
    • public SimpleDateFormat(String pattern):该构造方法可以用参数pattern指定的格式创建一个对象
  • 格式化:
    • public String format(Date date):方法格式化时间对象date
  • 解析:
    • public Date parse(String source):从给定字符串的开始解析文本,以生成一个日期

在这里插入图片描述

举例:

@Test
public void test3() throws ParseException {SimpleDateFormat sdf = new SimpleDateFormat();//格式化:日期--->字符串Date date1 = new Date();String strDate = sdf.format(date1);System.out.println(strDate);//22-12-5 下午2:21//解析:字符串 ---> 日期Date date2 = sdf.parse("22-12-5 下午3:21");System.out.println(date2);
}
@Test
public void test4() throws ParseException {SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒 SSS毫秒  E Z");// 格式化:日期--->字符串Date date1 = new Date();String strDate = sdf.format(date1);System.out.println(strDate);// 2023年04月17日 17时13分32秒 036毫秒  星期一 +0800// 解析:字符串 ---> 日期Date date2 = sdf.parse("2023年04月17日 17时12分55秒 983毫秒  星期一 +0800");System.out.println(date2);// Mon Apr 17 17:12:55 CST 2023// 解析失败。因为参数的字符串不满足SimpleDateFormat可以识别的格式。// Date date3 = sdf.parse("22-12-5 下午2:21");// System.out.println(date2);
}

4、java.util.Calendar(日历)

在这里插入图片描述

  • Date类的API大部分被废弃了,替换为Calendar

  • Calendar 类是一个抽象类,主用用于完成日期字段之间相互操作的功能

  • 获取Calendar实例的方法

    • 使用Calendar.getInstance()方法
      在这里插入图片描述
    • 调用它的子类GregorianCalendar(公历)的构造器
      -
  • 一个Calendar的实例是系统时间的抽象表示,可以修改或获取 YEAR、MONTH、DAY_OF_WEEK、HOUR_OF_DAY 、MINUTE、SECOND等 日历字段对应的时间值

    • public int get(int field):返回给定日历字段的值
    • public void set(int field,int value) :将给定的日历字段设置为指定的值
    • public void add(int field,int amount):根据日历的规则,为给定的日历字段添加或者减去指定的时间量
    • public final Date getTime():将Calendar转成Date对象
    • public final void setTime(Date date):使用指定的Date对象重置Calendar的时间
  • 常用字段

在这里插入图片描述

  • 注意:
    • 获取月份时:一月是0,二月是1,以此类推,12月是11
    • 获取星期时:周日是1,周一是2 , 。。。。周六是7

举例:

@Test
public void test5() {Calendar calendar = Calendar.getInstance();System.out.println("日历类型:" + calendar.getClass());// class java.util.GregorianCalendar// 测试方法// get(int field)System.out.println("当月第几天:" + calendar.get(Calendar.DAY_OF_MONTH)); System.out.println("当年第几天:" + calendar.get(Calendar.DAY_OF_YEAR));// set(int field,xx)calendar.set(Calendar.DAY_OF_MONTH, 23);System.out.println("设置为当月第23天:" + calendar.get(Calendar.DAY_OF_MONTH));// add(int field,xx)calendar.add(Calendar.DAY_OF_MONTH, 3);calendar.add(Calendar.DAY_OF_MONTH, -5);System.out.println("当月天数,先加3天,再减5天" + calendar.get(Calendar.DAY_OF_MONTH));// getTime():Calender --> DateDate date = calendar.getTime();System.out.println("日历类转换为Date" + date);// setTime():使用指定Date重置CalendarDate date1 = new Date();calendar.setTime(date1);System.out.println(calendar.get(Calendar.DAY_OF_MONTH));
}

二、JDK8:新的日期时间API

1、为什么会有新的时间API

  • 可变性:像日期和时间这样的类应该是不可变的
  • 偏移性:Date中的年份是从1900开始的,而月份都从0开始
  • 格式化:格式化只对Date有用,Calendar则不行
  • 此外,它们也不是线程安全的;不能处理闰秒等

总结:对日期和时间的操作一直是Java程序员最痛苦的地方之一

第三次引入的API是成功的,并且Java 8中引入的java.time API 已经纠正了过去的缺陷,将来很长一段时间内它都会为我们服务

Java 8 以一个新的开始为 Java 创建优秀的 API。新的日期时间API包含:

  • java.time – 包含值对象的基础包
    • 时钟(Clock)
    • 本地日期(LocalDate)
    • 本地时间(LocalTime)
    • 本地日期时间(LocalDateTime)
    • 时区(ZonedDateTime)
    • 持续时间(Duration)
  • java.time.chrono – 提供对不同的日历系统的访问。
  • java.time.format – 格式化和解析时间和日期
  • java.time.temporal – 包括底层框架和扩展特性
  • java.time.zone – 包含时区支持的类

尽管有68个新的公开类型,但是大多数开发者只会用到基础包和format包,大概占总数的三分之一

2、本地日期时间:LocalDate、LocalTime、LocalDateTime

方法描述
now() / now(ZoneId zone)静态方法,根据当前时间创建对象/指定时区的对象
of(xx,xx,xx,xx,xx,xxx)静态方法,根据指定日期/时间创建对象
getDayOfMonth()/getDayOfYear()获得月份天数(1-31) /获得年份天数(1-366)
getDayOfWeek()获得星期几(返回一个 DayOfWeek 枚举值)
getMonth()获得月份, 返回一个 Month 枚举值
getMonthValue() / getYear()获得月份(1-12) /获得年份
getHours()/getMinute()/getSecond()获得当前对象对应的小时、分钟、秒
withDayOfMonth()/withDayOfYear()/withMonth()/withYear()将月份天数、年份天数、月份、年份修改为指定的值并返回新的对象
with(TemporalAdjuster t)将当前日期时间设置为校对器指定的日期时间
plusDays(), plusWeeks(), plusMonths(), plusYears(),plusHours()向当前对象添加几天、几周、几个月、几年、几小时
minusMonths() / minusWeeks()/minusDays()/minusYears()/minusHours()从当前对象减去几月、几周、几天、几年、几小时
plus(TemporalAmount t)/minus(TemporalAmount t)添加或减少一个 Duration 或 Period
isBefore()/isAfter()比较两个 LocalDate
isLeapYear()判断是否是闰年(在LocalDate类中声明)
format(DateTimeFormatter t)格式化本地日期、时间,返回一个字符串
parse(Charsequence text)将指定格式的字符串解析为日期、时间

举例:

@Test
public void test1() {//now():获取当前日期和时间对应的实例LocalDate localDate = LocalDate.now();LocalTime localTime = LocalTime.now();LocalDateTime localDateTime = LocalDateTime.now();System.out.println(localDate);//2022-12-05System.out.println(localTime);//15:43:51.474System.out.println(localDateTime); //2022-12-05T15:43:51.475//of():获取指定的日期、时间对应的实例LocalDate localDate1 = LocalDate.of(2021, 5, 23);LocalDateTime localDateTime1 = LocalDateTime.of(2022, 12, 5, 11, 23, 45);System.out.println(localDate1);//2021-05-23System.out.println(localDateTime1);//2022-12-05T11:23:45//getXXX()LocalDateTime localDateTime2 = LocalDateTime.now();System.out.println(localDateTime2.getDayOfMonth());// 当月的第几天//体现不可变性//withXxx()LocalDateTime localDateTime3 = localDateTime2.withDayOfMonth(10);System.out.println(localDateTime2);//2022-12-05T15:48:48.399// 当前时间System.out.println(localDateTime3);//2022-12-15T15:48:48.399// 当前月,日期修改为10//plusXxx()LocalDateTime localDateTime4 = localDateTime2.plusDays(5);System.out.println(localDateTime2);//2022-12-05T15:50:21.864// 当前日期System.out.println(localDateTime4);//2022-12-10T15:50:21.864// 当前日期加5天
}

3、瞬时:Instant

  • Instant:时间线上的一个瞬时点。 这可能被用来记录应用程序中的事件时间戳
  • 时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数
  • java.time.Instant表示时间线上的一点,而不需要任何上下文信息,例如,时区
    • 概念上讲,它只是简单的表示自1970年1月1日0时0分0秒(UTC)开始的秒数
方法描述
now()静态方法,返回默认UTC时区的Instant类的对象
ofEpochMilli(long epochMilli)静态方法,返回在1970-01-01 00:00:00基础上加上指定毫秒数之后的Instant类的对象
atOffset(ZoneOffset offset)结合即时的偏移来创建一个 OffsetDateTime
toEpochMilli()返回1970-01-01 00:00:00到当前时间的毫秒数,即为时间戳
  • 中国大陆、中国香港、中国澳门、中国台湾、蒙古国、新加坡、马来西亚、菲律宾、西澳大利亚州的时间与UTC的时差均为+8,也就是UTC+8
  • instant.atOffset(ZoneOffset.ofHours(8))

在这里插入图片描述

  • 整个地球分为二十四时区,每个时区都有自己的本地时间
  • 北京时区是东八区,领先UTC八个小时

举例:

@Test
public void test2() {//now():Instant instant = Instant.now();System.out.println(instant);//2023-04-17T13:44:14.137382Z//了解:OffsetDateTime instant1 = instant.atOffset(ZoneOffset.ofHours(8));System.out.println(instant1);//2023-04-17T21:44:14.137382+08:00Instant instant2 = Instant.ofEpochMilli(24123123312L);System.out.println(instant2);//1970-10-07T04:52:03.312Zlong milliTime = instant.toEpochMilli();System.out.println(milliTime);//1681739054137System.out.println(new Date().getTime());//1681739054142
}

4、日期时间格式化:DateTimeFormatter

  • (了解)预定义的标准格式。如:ISO_LOCAL_DATE_TIME、ISO_LOCAL_DATE、ISO_LOCAL_TIME
  • (了解)本地化相关的格式。如:ofLocalizedDate(FormatStyle.LONG)
  • 自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)
ofPattern(String pattern)静态方法,返回一个指定字符串格式的DateTimeFormatter
format(TemporalAccessor t)格式化一个日期、时间,返回字符串
parse(CharSequence text)将指定格式的字符序列解析为一个日期、时间

举例:

public class TestDatetimeFormatter {@Testpublic void test1(){// 方式一:预定义的标准格式。如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIMEDateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;// 格式化:日期-->字符串LocalDateTime localDateTime = LocalDateTime.now();String str1 = formatter.format(localDateTime);System.out.println(localDateTime);System.out.println(str1);//2022-12-04T21:02:14.808// 解析:字符串 -->日期TemporalAccessor parse = formatter.parse("2022-12-04T21:02:14.808");LocalDateTime dateTime = LocalDateTime.from(parse);System.out.println(dateTime);}@Testpublic void test2(){LocalDateTime localDateTime = LocalDateTime.now();// 方式二:// 本地化相关的格式。如:ofLocalizedDateTime()// FormatStyle.LONG / FormatStyle.MEDIUM / FormatStyle.SHORT :适用于LocalDateTimeDateTimeFormatter formatter1 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG);// 格式化String str2 = formatter1.format(localDateTime);System.out.println(str2);// 2022年12月4日 下午09时03分55秒// 本地化相关的格式。如:ofLocalizedDate()// FormatStyle.FULL / FormatStyle.LONG / FormatStyle.MEDIUM / FormatStyle.SHORT : 适用于LocalDateDateTimeFormatter formatter2 = DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL);// 格式化String str3 = formatter2.format(LocalDate.now());System.out.println(str3);// 2022年12月4日 星期日}@Testpublic void test3(){//方式三:自定义的方式(关注、重点)DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");//格式化String strDateTime = dateTimeFormatter.format(LocalDateTime.now());System.out.println(strDateTime); //2022/12/04 21:05:42//解析TemporalAccessor accessor = dateTimeFormatter.parse("2022/12/04 21:05:42");LocalDateTime localDateTime = LocalDateTime.from(accessor);System.out.println(localDateTime); //2022-12-04T21:05:42}
}

三、与传统日期处理的转换

To 遗留类From 遗留类
java.time.Instant与java.util.DateDate.from(instant)date.toInstant()
java.time.Instant与java.sql.TimestampTimestamp.from(instant)timestamp.toInstant()
java.time.ZonedDateTime与java.util.GregorianCalendarGregorianCalendar.from(zonedDateTime)cal.toZonedDateTime()
java.time.LocalDate与java.sql.TimeDate.valueOf(localDate)date.toLocalDate()
java.time.LocalTime与java.sql.TimeDate.valueOf(localDate)date.toLocalTime()
java.time.LocalDateTime与java.sql.TimestampTimestamp.valueOf(localDateTime)timestamp.toLocalDateTime()
java.time.ZoneId与java.util.TimeZoneTimezone.getTimeZone(id)timeZone.toZoneId()
java.time.format.DateTimeFormatter与java.text.DateFormatformatter.toFormat()

http://www.ppmy.cn/news/46907.html

相关文章

Golang流媒体实战之七:hls拉流服务源码阅读

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是《Golang流媒体实战》系列的第七篇,继续学习一个重要且通用的知识点:hls拉流在《体验开源项目lal》一文中&#xff0…

【大数据基础】基于 TMDB 数据集的电影数据分析

https://dblab.xmu.edu.cn/blog/2400/ 实验内容 环境搭建 pip3 install bottle数据预处理 本次项目使用的数据集来自知名数据网站 Kaggle 的 tmdb-movie-metadata 电影数据集,该数据集包含大约 5000 部电影的相关数据。本次实验使用数据集中有关电影的数据表 tm…

公司新来一00后说我不会自动化测试,3个问题直接给他问趴下...

今天我们公司刚入职一小伙,听说是00后,今天在办公室交流了一下,他问我会不会自动化测试,我直呼好家伙,直接问了他3个开展自动化测试问题....一问3不知.....还有待加强呀 我们在制定自动化测试实施策略时,首…

哪个洗脱一体机好用?好用的洗拖一体机推荐

洗地机是一款使用非常方便的清洁工具,通常可以实现吸、拖、洗三个功能,对于各类家庭污渍都有着不错的处理能力,无论是干燥垃圾还是潮湿垃圾一律可以有效清理。不过很多新手朋友在选购洗地机时会因为看不懂参数而频繁踩雷。本文为大家整理了洗…

【hello Linux】理解文件系统

目录 创建文件的过程: 删除文件的过程: 创建目录的过程: 查看inode编号: 硬链接 软链接 Linux🌷 我们知道文件所有数据 文件内容 文件属性信息; 未打开的文件是被存放到磁盘/固态硬盘中的; …

Allegro thermal relief热风焊盘

为了画个通孔焊盘,看了很久的 Thermal relief相关的内容,终于基本上理解了。记录一下。 这篇文章讲得非常清楚: 深入理解Allegro之Thermal Relief与Anti Pad - 百度文库 (baidu.com) 热风焊盘般用在内层,减少一些焊盘和铜皮的连…

Leetcode究极刷题笔记(31~35)

(31)下一个排列(中等) 实现思路: 从题目中,我们可以看出本题的意思就是让你选一个比当前序列大的最小的那个解,比如132,哪么比它大的最小解就是213(先从第一位开始比&am…

Js实现滚动变色的文字效果

<html> <head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8" /> <title>滚动变色的文字js特效</title> </head> <body> <div style"width:736px;"> 请注意下方的文…