Java 日期类 API

1. jdk8 之前的日期 API

1.1. System 类 currentTimeMillis();

@Test  
public void test1() {  long timeMillis = System.currentTimeMillis();  System.out.println("timeMillis = " + timeMillis);  
}

1.2. java.util.Date 和 java.sql.Date

  1. java.sql.Datejava.util.Date 的子类:
  2. 两个构造器的使用
    1. new Date() ==> 获取当前的时间
    2. new Date(long timeMills) ==> 获取指定时间戳下的时间
  3. 两个方法的使用
    1. toString()
    2. getTime()==>获取当前Data对象的时间戳
Date date1 = new Date();
System.out.println("date1 = " + date1);   //date1 = Tue Jul 06 09:47:42 CST 2021
System.out.println("date1.getTime() = " + date1.getTime()); //date1.getTime() = 1625536103670Date date2 = new Date(123456789L);
System.out.println("date2 = " + date2);  //date2 = Fri Jan 02 18:17:36 CST 1970java.sql.Date date3 = new java.sql.Date(123456789L);
System.out.println("date3 = " + date3);  //date3 = 1970-01-02//将java.util.Date转换成java.sql.Date
java.sql.Date date4 = new java.sql.Date(date1.getTime());
System.out.println("date4 = " + date4);  //date4 = 2021-07-06

1.3. java.text.SimpleDateFormat

@Test
public void test1() throws ParseException {SimpleDateFormat sdf = new SimpleDateFormat();//格式化Date date = new Date();System.out.println("date = " + date);String format = sdf.format(date);System.out.println("format = " + format);//解析String str = "2019-08-12 12:00:00";//设置解析日期字符串的模式,可以在创建SimpleDateFormat(String pattern);设置sdf.applyPattern("yyyy-MM-dd hh:mm:ss");sdf.parse(str);System.out.println("str = " + str);
}

1.4. 线程安全的日期格式化工具类

public class DataUtils {/*** ThreadLocal 提供一种 lombda 构造方式* 返回此线程局部变量的当前线程的“初始值”。线程第一次使用 get() 方法访问变量时将调用此方法,* 但如果线程之前调用了 set(T) 方法,则不会对该线程再调用 initialValue 方法。通常,此方法* 对每个线程最多调用一次,但如果在调用 get() 后又调用了 remove(),则可能再次调用此方法。*/private static ThreadLocal<DateFormat> threadLocal= ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));public static Date parse(String date) {try {return threadLocal.get().parse(date);} catch (Exception e) {return null;}}public static String format(Date date){return date != null ? threadLocal.get().format(date) : null;}public static Date parse(String date, String pattern) {try {return new SimpleDateFormat(pattern).parse(date);} catch (Exception e) {return null;}}public static String format(Date date, String pattern){return date != null ? new SimpleDateFormat(pattern).format(date) : null;}
}

LetterDate or Time ComponentExamples
GEra designatorAD
yYear1996; 96
YWeek year2009; 09
MMonth in year (context sensitive)July; Jul; 07
LMonth in year (standalone form)July; Jul; 07
wWeek in year27
WWeek in month2
DDay in year189
dDay in month10
FDay of week in month2
EDay name in weekTuesday; Tue
uDay number of week (1 = Monday, …, 7 = Sunday)1
aAm/pm markerPM
HHour in day (0-23)0
kHour in day (1-24)24
KHour in am/pm (0-11)0
hHour in am/pm (1-12)12
mMinute in hour30
sSecond in minute55
SMillisecond978
zTime zonePacific Standard Time; PST; GMT-08:00
ZTime zone-0800
XTime zone-08; -0800; -08:00

1.5. java.util.Calendar(日历)

  • Date 类的API大部分被废弃了,替换为 Calendar
  • Calendar 类是一个抽象类,主用用于完成日期字段之间相互操作的功能。
  • 获取 Calendar 实例的方法
    • 使用 Calendar.getInstance() 方法
    • 调用它的子类 GregorianCalendar(公历)的构造器。

修饰符和类型方法描述
static CalendargetInstance()获取使用默认时区和区域设置的日历。
static CalendargetInstance(Locale aLocale)获取使用默认时区和指定区域设置的日历。
static CalendargetInstance(TimeZone zone)获取使用指定时区和默认区域设置的日历。
static CalendargetInstance(TimeZone zone, Locale aLocale)获取具有指定时区和区域设置的日历。

Calendar 的相关方法:

  • 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的时间

其中 field 的值为 Calendar 的一组静态常量:YEARMONTHDAY_OF_WEEKHOUR_OF_DAYMINUTESECOND等;

1.6. jdk8 之前的时间 API 缺陷

  1. 可变性:像日期、时间这样的类应该是不可变的;
  2. 偏移性Date 中的年份都是从 1900 年开始,月份都是从 0 开始的;
  3. 格式化:格式化只对 Date 类型数据有效,无法应用于 Calendar
  4. 安全性DateCalendar 都是线程不安全的,此外还不能处理闰秒的情况;

2. jdk8 新增的时间 API

新的日期 API

  1. java.time:包含值对象的基础包
  2. java.time.chrono:提供对不同的日历系统的访问
  3. java.time.format:格式化和解析时间和日期
  4. java.time.temporal:包括底层框架和扩展特性
  5. java.time.zone:包含时区支持的类

大多数情况只会用到基础包和 format 包,偶尔会用到 temporal

2.1. LocalDate、LocalTime、LocalDateTime

  1. LocalDate 代表 IOS 格式(yyyy-MM-dd)的日期,可以存储 生日、纪念日等日期。
  2. LocalTime 表示一个时间,而不是日期。
  3. 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() {System.out.println("now()==============================");//now(): 获取当前日期,时间,日期+时间LocalDate localDate = LocalDate.now();LocalTime localTime = LocalTime.now();LocalDateTime localDateTime = LocalDateTime.now();System.out.println("localDate = " + localDate);	//2021-07-06System.out.println("localTime = " + localTime);	//18:05:16.139System.out.println("localDateTime = " + localDateTime);	//2021-07-06T18:05:16.140System.out.println("of()===============================");//of(): 根据指定日期/时间创建对象(没有偏移量)LocalDateTime localDateTimeWithOf = LocalDateTime.of(1999, 06, 12, 6, 30, 0);System.out.println("localDateTimeWithOf = " + localDateTimeWithOf);	///1999-06-12T06:30//getXxx():System.out.println("getXxx()===========================");int dayOfMonth = localDateTime.getDayOfMonth();System.out.println("dayOfMonth = " + dayOfMonth);	//6DayOfWeek dayOfWeek = localDateTime.getDayOfWeek();	System.out.println("dayOfWeek = " + dayOfWeek);	    //TUESDAYSystem.out.println("dayOfWeek.getValue() = " + dayOfWeek.getValue()); //2System.out.println("with()=============================");//with(): 修改指定值===>返回一个新的对象LocalDateTime localDateTime1 = localDateTimeWithOf.withYear(2021);System.out.println("localDateTime1 = " + localDateTime1);	//2021-06-12T06:30LocalDateTime localDateTime2 = localDateTime1.withDayOfYear(120);System.out.println("localDateTime2 = " + localDateTime2);	//2021-04-30T06:30System.out.println("plusXxx()==========================");//plusXxx(): 在指定的年月日/时间上加上指定的值===>返回新的对象LocalDateTime localDateTime3 = localDateTime2.plusSeconds(30);System.out.println("localDateTime3 = " + localDateTime3);	//2021-04-30T06:30:30LocalDateTime localDateTime4 = localDateTime3.plusHours(8);System.out.println("localDateTime4 = " + localDateTime4);	//2021-04-30T14:30:30System.out.println("minusXxx()=========================");//minusXxx(): 在指定的年月日/时间上减去指定的值===>返回新的对象LocalDateTime localDateTime5 = localDateTime4.minusHours(8);System.out.println("localDateTime5 = " + localDateTime5);	//2021-04-30T06:30:30LocalDateTime localDateTime6 = localDateTime5.minusDays(120);System.out.println("localDateTime6 = " + localDateTime6);	//2020-12-31T06:30:30
}

![[image-20210706180759805.png]]

2.2. Instant

@Test
public void test1() {//now(): 获取本初子午线对应的标准时间Instant instant = Instant.now();System.out.println("instant = " + instant);//获取指定偏移量的标准时间,+表示东区;-表示西区//获取东八区,即北京时间OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));//获取标准时间对应的时间戳System.out.println("instant.toEpochMilli() = " + instant.toEpochMilli());//通过指定的毫秒数,获取Instant实例Instant instant1 = Instant.ofEpochMilli(1625569576277L);System.out.println("instant1 = " + instant1.atOffset(ZoneOffset.ofHours(8)));
}

2.3. DateFormatter

格式化和解析日期时间

  1. 预定义的标准格式:ISO_LOCAL_DATE_TIME; ISO_LOCAL_DATE; ISO_LOCAL_TIME
  2. 本地化相关的格式:
    1. ofLocalizedDateTime(FormatStyle.LONG)
      1. FormatStyle.LONG:2021年7月6日 下午07时52分01秒
      2. FormatStyle.MEDIUM:2021-7-6 19:52:14
      3. FormatStyle.SHORT:21-7-6 下午7:52
    2. ofLocalizedDate(FormatStyle.LONG)
      1. FormatStyle.FULL:2021年7月6日 星期二
      2. FormatStyle.LONG:2021年7月6日
      3. FormatStyle.MEDIUM:2021-7-6
      4. FormatStyle.SHORT:21-7-6
  3. 自定义的格式:ofPattern()
@Test
public void test1() {//1.预定义的标准格式:ISO_LOCAL_DATE_TIME; ISO_LOCAL_DATE; ISO_LOCAL_TIMEDateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;LocalDateTime localDateTime = LocalDateTime.now();String format = formatter.format(localDateTime);System.out.println("format = " + format);   //2021-07-06T19:57:29.391TemporalAccessor parse = formatter.parse("2021-07-06T19:42:01.801");//将TemporalAccessor转为LocalDateTimeLocalDateTime localDateTime1 = LocalDateTime.from(parse);System.out.println("localDateTime1 = " + localDateTime1);       //2021-07-06T19:42:01.801//2.本地化相关的格式:ofLocalizedDateTime(FormatStyle.LONG)//提供了三个常量:// FormatStyle.LONG: 2021年7月6日 下午07时52分01秒// FormatStyle.MEDIUM: 2021-7-6 19:52:14// FormatStyle.SHORT: 21-7-6 下午7:52DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT);System.out.println(dateTimeFormatter.format(localDateTime));        //21-7-6 下午7:57//3.本地化相关的格式:ofLocalizedDate(FormatStyle.LONG)//提供了四个常量:// FormatStyle.FULL: 2021年7月6日 星期二// FormatStyle.LONG: 2021年7月6日// FormatStyle.MEDIUM: 2021-7-6// FormatStyle.SHORT: 21-7-6dateTimeFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT);System.out.println(dateTimeFormatter.format(localDateTime));        //21-7-6//4.自定义的格式:ofPattern()dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");System.out.println(dateTimeFormatter.format(localDateTime));        //2021-07-06
}

2.4. ZoneId 类中包含了所有的时区信息

  1. ZoneId.getAvailableZoneIds(); 获取所有的时区集
  2. LocalDateTime.now(ZoneId.of("Asia/Shanghai")); 获取指定时区的时间
@Test
public void test1() {//获得所有的时区集Set<String> zoneIds = ZoneId.getAvailableZoneIds();//获取上海时区的当前时间LocalDateTime localDateTime = LocalDateTime.now(ZoneId.of("Asia/Shanghai"));System.out.println("localDateTime = " + localDateTime); //2021-07-06T20:44:54.828
}

2.5. ZonedDateTime 带时区的日期时间

  1. ZonedDateTime.now(); 获取本时区的对象,不带时区
  2. ZonedDateTime.now(ZoneId.of(“Asia/Shanghai”)); 获取指定时区的对象
@Test
public void test2() {ZonedDateTime zonedDateTime = ZonedDateTime.now();System.out.println("zonedDateTime = " + zonedDateTime); //2021-07-06T20:44:22.490+08:00[Asia/Shanghai]ZonedDateTime zonedDateTime1 = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));System.out.println("zonedDateTime1 = " + zonedDateTime1); //2021-07-06T20:44:22.490+08:00[Asia/Shanghai]
}

2.6. Duration 用于计算两个“时间”间隔,以秒和纳秒为基准

  1. Duration.between(TemporalAccessor time1, TemporalAccessor time2); 返回一个 Duration 对象实例
  2. duration.getSeconds(); 返回两个时间之间相差的秒数
  3. duration.getNano(); 返回两个时间相差的毫微妙(Long),对1秒取余
  4. duration1.toDays(); 返回两个时间相差的天数
@Test
public void test3() throws InterruptedException {LocalTime localTime1 = LocalTime.now();Thread.sleep(9543L);LocalTime localTime2 = LocalTime.now();Duration duration = Duration.between(localTime1, localTime2);System.out.println("duration = " + duration);   //duration = PT9.639SSystem.out.println("duration.getSeconds() = " + duration.getSeconds());//返回毫微妙级的long值System.out.println("duration.getNano() = " + duration.getNano());LocalDateTime localDateTime1 = LocalDateTime.of(2019, 6, 13, 8, 0, 0);LocalDateTime localDateTime2 = LocalDateTime.of(2019, 6, 15, 13, 30, 0);Duration duration1 = Duration.between(localDateTime1, localDateTime2);System.out.println("duration1 = " + duration1);System.out.println("duration1.toDays() = " + duration1.toDays());
}

2.7. Period 用于计算两个“日期”间隔,以年、月、日衡量

  1. Period.between(localDate2, localDate1); 返回一个 Period 对象实例
  2. period1.getYears()period1.getMonths()period1.getDays() 相差的年月日,三者拼在一起才是两个日期只差
  3. period1.withYears(int year); 设置 Period 对象实例;
  4. period1.addTo(TemporalAccessor time); 把当前 Period 对象记录的日期差加到指定的日期上,返回一个 TemporalAccessor
@Test
public void test4() {LocalDate localDate1 = LocalDate.of(2021, 7, 6);LocalDate localDate2 = LocalDate.of(2020, 6, 13);Period period1 = Period.between(localDate2, localDate1);System.out.println("period1 = " + period1);System.out.println("period1.getYears() = " + period1.getYears());   //1System.out.println("period1.getMonths() = " + period1.getMonths()); //0System.out.println("period1.getDays() = " + period1.getDays());     //23//所以两个日期相差了1年零23天//设置period1的值Period period2 = period1.withYears(2);//把当前相差的日期加到localDate1上,返回一个DateTemporal temporal = period1.addTo(localDate1);System.out.println("period2 = " + period2);System.out.println("temporal = " + temporal);
}

2.8. TemporalAdjuster 时间校正器

@Test
public void test5() {//获取当前日期的下一个周日是哪一天TemporalAdjuster temporalAdjuster = TemporalAdjusters.next(DayOfWeek.SUNDAY);LocalDate localDate = LocalDate.now().with(temporalAdjuster);System.out.println("localDate = " + localDate);//返回当前日期的下一个工作日是哪一天LocalDate localDate2 = LocalDate.now().with(new TemporalAdjuster() {@Overridepublic Temporal adjustInto(Temporal temporal) {LocalDate date = (LocalDate) temporal;if (date.getDayOfWeek().equals(DayOfWeek.FRIDAY)) {return date.plusDays(3);} else if (date.getDayOfWeek().equals(DayOfWeek.SATURDAY)) {return date.plusDays(2);} else {return date.plusDays(1);} }});System.out.println("localDate2 = " + localDate2);
}

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

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

相关文章

【Web后端】web后端开发简介_Servlet简介

1.web后端开发简介 Java企业级开发&#xff0c;也就是学习]avaEE(Enterprise Edition)版本,是一种结构和一套标准。在应用中开发的标准就是Servlet、jsp和JavaBean技术。jsp技术现在已基本处于淘汰状态&#xff0c;简单了解即可web后端开发&#xff0c;基于B/S模式的开发体系。…

学习Java的日子 Day44 初识前端

Day44 HTML 学习路线&#xff1a; 前端&#xff1a;展示页面、与用户交互 — HTML 后端&#xff1a;数据的交互和传递 — JavaEE/JavaWeb 1.B/S和C/S B/S&#xff1a;浏览器/服务器 教务系统 C/S&#xff1a;客户端/服务器 优缺点 1.开发/维护成本&#xff1a;B/S相对低 2.运算…

全网最详细IOS系统APP上架教程(二)

上一篇讲解了IOS系统APP上架注册苹果开发者账号需要的材料、邓白氏编码的注册等&#xff0c;本文将继续讲解后续流程。 详细步骤 三、申请苹果开发者账号 在苹果手机上安装Apple Developer 打开Apple Developer&#xff0c;用之前注册好的Apple ID登录&#xff0c;输入姓名身…

数据是形成新质生产力的优质生产要素

在数字经济背景下&#xff0c;新质生产力以科技创新推动产业创新为要义&#xff0c;以大幅提升全要素生产率为目标&#xff0c;重在加强人工智能、大数据、物联网、工业互联网等数字技术的融合应用&#xff0c;以数据开发利用为引擎促使生产要素实现创新性配置&#xff0c;催生…

vite创建的项目使用rem适配

下面以创建vue3.0 项目为例&#xff1a; npm init vitelatest “名称” 选择vue &#xff08;选择你所对应的语言&#xff09; 更具提示步骤执行 cd xxx npm i npm run dev 然后再项目中使用 rem 需要安装插件 第一步安装插件 npm i amfe-flexible npm i postcss-pxtorem 第二…

没有公网ip,如何实现外网访问内网?

目前拨号上网是最广泛的上网方式&#xff0c;这种方式优点是价格便宜&#xff0c;缺点是没有固定公网ip&#xff0c;每次重新您拨号ip地址都会变。如果有一台服务器&#xff0c;需要实现外网访问&#xff0c;在没有固定公网ip的环境下&#xff0c;该如何实现呢&#xff1f;使用…

【JavaSE】/*初识Java*/

目录 一、了解 Java 语言 二、Java 语言的重要性 2.1 使用程度 2.2 工作领域 三、Java 语言的特性 四、Java 的基础语法 五、可能遇到的错误 六、第一个 java 程序代码解析 七、Java 注释 八、Java 标识符 九、Java 关键字 一、了解 Java 语言 Java 是由 Sun Micr…

LeetCode题练习与总结:反转链表Ⅱ--92

一、题目描述 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], left 2, right 4 输出&#…

Java入门基础学习笔记15——强制类型转换

大范围类型的变量是否可以赋值给小范围类型的变量呢&#xff1f; IDEA直接报错。直接报错&#xff0c;是提醒你有问题。但是我非常进行类型转换。 非要强行赋值呢&#xff1f; 强制类型转换&#xff0c;强行将类型范围大的变量&#xff0c;数据赋值给类型范围小的变量。 数据…

简单的Python HTML 输出

1、问题背景 一名初学者在尝试将 Python 脚本输出到网页上时遇到了一些问题。他当前使用 Python 和 HTML 进行开发&#xff0c;并且遇到了以下问题&#xff1a; 担心自己的代码过于复杂&#xff0c;尤其是 WebOutput() 函数。希望通过 JavaScript 使用 HTML 模板文件更新数据。…

前端开发指导

前端开发指导 本文介绍了配置前端开发环境需要的软件、配置项等,指导如何开始进行UDM部门前端开发的全流程。本文以Windows系统下在Microsoft Virtual Studio Code中开发为基础。 一、综述 目标:零基础或者新员工依照此文档,能够完成开发环境的搭建及熟悉测试环境的搭建。…

【数据结构】顺序表(一)

✨✨✨专栏&#xff1a;数据结构 &#x1f9d1;‍&#x1f393;个人主页&#xff1a;SWsunlight 不怕别人看不起&#xff0c;就怕自己不争气。路是人走出来的&#xff0c;关键要靠自己闯。振作起来&#xff0c;生活的含义就是前进。 目录 一、顺序表的概念&#xff1a; 二…