java时间日期API
一、JDK8.0以前
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | public class DateTimeTest { /* java.util.Date类 |-----java.sql.Date类 1.两个构造器的使用 >构造器一;Date():创建一个对应当前时间的Date对象 >构造器二:创建指定毫秒数的Date对象 2.两个方法的使用 >toString():显示当前的年、月、日、时、分、秒 >getTime():获取当前Date对象对应的毫秒数。(时间戳) 3.java.sql.Date对应着数据库中的日期类型的变量 >如何实例化 >如何将java.util.Date对象转换为java.sql.Date对象 */ @Test public void test2(){ //构造器一;Date():创建一个对应当前时间的Date对象 Date date1 = new Date(); // System.out.println(date1.toString()); System.out.println(date1.getTime()); // //构造器二:创建指定毫秒数的Date对象 Date date2 = new Date(1550306204104l); System.out.println(date2.toString()); //创建java.sql.Date对象 java.sql.Date date3 = new java.sql.Date(3565456358995l); System.out.println(date3); //如何将java.util.Date对象转换为java.sql.Date对象 //情况一: // Date date4 = new java.sql.Date(55488464646464848l); // java.sql.Date date5 = (java.sql.Date) date4; //情况二; Date date6 = new Date(); java.sql.Date date7 = new java.sql.Date(date6.getTime()); } //1.System类中的currentTimeMillis(); @Test public void test1(){ long time = System.currentTimeMillis(); System.out.println(time); } } |
2.java.text.SimpleDateFormat类
SimpleDateFormat对日期Date类的格式化和解析
1.两个操作:
1.1 格式化:日期 ----> 字符串
1.2 解析:格式化的逆过程,字符串 ----> 日期
2.SimpleDateFormat的实例化:new + 构造器
//*********按照指定的方式格式化和解析:调用带参的构造器**************** // SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy.MMMM.dd GGG hh:mm aaa"); SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); //格式化 String format1 = sdf1.format(date); System.out.println(format1); //解析:要求字符串必须是符合SimpleDateFormat识别的格式(通过构造器参数体现), //否则,抛异常 Date date2 = sdf1.parse("2019-02-18 11:25:25"); System.out.println(date2);
练习:
/* 练习一:字符串“2020-09-08”转换为java.sql.Date 练习二:“三天打鱼两天晒网” 1990-01-01 xxxx-xx-xx 打鱼?晒网? 举例;2020-09-08 ? 总天数 总天数 % 5 ==1,2,3:打鱼 总天数 % 5 ==4,0:晒网 总天数的计算? 方式一:(date2.getTime() - date1.getTime())/(1000 * 60 * 60 * 24) + 1 方式二:1990-01-01 ---> 2019-12-31 + 2020-01-01 ---> 2020-09-08 */ @Test public void testExer() throws ParseException { String birth = "2020-09-08"; SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd"); Date date = sdf1.parse(birth); java.sql.Date barthDate = new java.sql.Date(date.getTime()); System.out.println(barthDate); }
3.Calendar日历类(抽象类)
@Test public void testCalendar(){ //1.实例化 //方式一:创建其子类(GregorianCalendar)的对象 //方式二:调用其静态方法getInstance() Calendar calendar = Calendar.getInstance(); //常用方法 //get() int days = calendar.get(Calendar.DAY_OF_YEAR); System.out.println(days); System.out.println(calendar.get(Calendar.DAY_OF_MONTH)); //set() calendar.set(Calendar.DAY_OF_MONTH,22); int days1 = calendar.get(Calendar.DAY_OF_YEAR); System.out.println(days1); //add() calendar.add(Calendar.DAY_OF_MONTH,3); int days2 = calendar.get(Calendar.DAY_OF_YEAR); System.out.println(days2); //getTime():日历类 ---> Date Date date = calendar.getTime(); System.out.println(date); //setTime():Date ----> 日历类 Date date1 = new Date(); calendar.setTime(date1); int days3 = calendar.get(Calendar.DAY_OF_MONTH); System.out.println(days3); }
日期时间API的迭代:
第一代:jdk 1.0 Date类
第二类; jdk 1.1 Calendar类,一定程度上替换Date类
第三代: jdk 1.8 提出了新的一套API
前两代存在的问题;
可变性:像日期和时间这样的类应该是不可变的。
偏移性:Date中的年份是从1900开始的,而月份都从0开始。
格式化:格式化只对Date有用,Calendar则不行。
此外,它们也不是线程安全的;不能处理闰秒等
java 8 中新的日期时间API涉及到的包
4.LocalDate、LocalTime、LocalDateTime
说明:
①:分别表示使用 ISO-8601日历系统的日期、时间、日期和时间。它们提供了简单的本地日期或时间,并不包含当前的时间信息,也不包含与时区相关的信息。
②、LocalDateTime相较于LocalDate、LocalTime,使用频率高
③、类似于Calender
常用方法:
@Test public void test1(){ //now()获取当前的日期、时间、日期+时间 LocalDate localDate = LocalDate.now(); LocalTime localTime = LocalTime.now(); LocalDateTime localDateTime = LocalDateTime.now(); System.out.println(localDate); System.out.println(localTime); System.out.println(localDateTime); //of():设置指定的年月日时分秒,没有偏移量 LocalDateTime localDateTime1 = LocalDateTime.of(2020, 10, 6, 13, 2, 32); System.out.println(localDateTime1); //getXxx():获取相关的属性 System.out.println(localDateTime.getDayOfMonth()); System.out.println(localDateTime.getDayOfWeek()); System.out.println(localDateTime.getMonth()); System.out.println(localDateTime.getMonthValue()); System.out.println(localDateTime.getMinute()); //体现不可变形 //withXxx():设置相关的属性 LocalDate localDate1 = localDate.withDayOfMonth(22); System.out.println(localDate); System.out.println(localDate1); LocalDateTime localDateTime2 = localDateTime.withHour(4); System.out.println(localDateTime); System.out.println(localDateTime2); //不可变性 LocalDateTime localDateTime3 = localDateTime.plusMonths(3); System.out.println(localDateTime); System.out.println(localDateTime3); LocalDateTime localDateTime4 = localDateTime.minusDays(6); System.out.println(localDateTime); System.out.println(localDateTime4); }
5.时间点:Instant
说明:
①、时间线上的一个瞬时点。概念上讲,它只是简单的表示自1970年1月1日0时0分0秒(UTC)开始的秒数。
②、类似于java.util.Date类
常用方法:
@Test public void test2(){ //now():获取本初子午线对应的标准时间 Instant instant = Instant.now(); System.out.println(instant); //添加时间的偏移量 OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8)); System.out.println(offsetDateTime); //获取1970年1月1日0时0分0秒(UTC)开始的毫秒数--->Date类的getTime() long milli = instant.toEpochMilli(); System.out.println(milli); //ofEpochMilli():通过给定的毫秒数,获取Instant实例 ---->Date(long millis) Instant instant1 = Instant.ofEpochMilli(465487846465456l); System.out.println(instant1); }
6.日期时间格式化类:DateTimeFormatter
说明:
①、格式化或解析日期、时间
②、类似于SimpleDateFormat
常用方法:
①、实例化方式:
预定义的标准格式。如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
本地化相关的格式。如:ofLocalizedDateTime(FormatStyle.LONG)
自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)
②、常用方法:
@Test public void test3(){ // 方式一: 预定义的标准格式。如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME; //格式化:日期 ---->字符串 LocalDateTime localDateTime = LocalDateTime.now(); String str1 = formatter.format(localDateTime); System.out.println(localDateTime); System.out.println(str1); //解析:字符串 --->日期 TemporalAccessor parse = formatter.parse("2022-01-20T23:03:19.8530589"); System.out.println(parse); // 方式二: 本地化相关的格式。如:ofLocalizedDateTime(FormatStyle.LONG) DateTimeFormatter formatter1 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT); //格式化 String str2 = formatter1.format(localDateTime); System.out.println(str2); // 方式三: 自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”) DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss"); //格式化 String str4 = formatter2.format(LocalDateTime.now()); System.out.println(str4); //解析 TemporalAccessor accessor = formatter2.parse("2022-01-20 11:19:27"); System.out.println(accessor); }
7、其他API
ZoneId :该类中包含了所有的时区信息,一个时区的ID,如 Europe/Paris
ZonedDateTime :一个在ISO-8601日历系统时区的日期时间,如 2007-12-03T10:15:30+01:00 Europe/Paris。
其中每个时区都对应着ID,地区ID都为“{区域}/{城市}”的格式,例如:Asia/Shanghai等
Clock :使用时区提供对当前即时、日期和时间的访问的时钟。
持续时间:Duration,用于计算两个“时间”间隔
日期间隔:Period,用于计算两个“日期”间隔
TemporalAdjuster : 时间校正器。有时我们可能需要获取例如:将日期调整到“下一个工作日”等操作。
emporalAdjusters : 该类通过静态方法(firstDayOfXxx()/lastDayOfXxx()/nextXxx())提供了大量的常用T emporalAdjuster 的实现
//ZoneId:类中包含了所有的时区信息 // ZoneId的getAvailableZoneIds():获取所有的ZoneId Set<String> zoneIds = ZoneId.getAvailableZoneIds(); for (String s : zoneIds) { System.out.println(s); } // ZoneId的of():获取指定时区的时间 LocalDateTime localDateTime = LocalDateTime.now(ZoneId.of("Asia/Tokyo")); System.out.println(localDateTime); //ZonedDateTime:带时区的日期时间 // ZonedDateTime的now():获取本时区的ZonedDateTime对象 ZonedDateTime zonedDateTime = ZonedDateTime.now(); System.out.println(zonedDateTime); // ZonedDateTime的now(ZoneId id):获取指定时区的ZonedDateTime对象 ZonedDateTime zonedDateTime1 = ZonedDateTime.now(ZoneId.of("Asia/Tokyo")); System.out.println(zonedDateTime1);
//Duration:用于计算两个“时间”间隔,以秒和纳秒为基准
LocalTime localTime = LocalTime.now();
LocalTime localTime1 = LocalTime.of(15, 23, 32);
//between():静态方法,返回Duration对象,表示两个时间的间隔
Duration duration = Duration.between(localTime1, localTime);
System.out.println(duration);
System.out.println(duration.getSeconds());
System.out.println(duration.getNano());
LocalDateTime localDateTime = LocalDateTime.of(2016, 6, 12, 15, 23, 32);
LocalDateTime localDateTime1 = LocalDateTime.of(2017, 6, 12, 15, 23, 32);
Duration duration1 = Duration.between(localDateTime1, localDateTime);
System.out.println(duration1.toDays());
//Period:用于计算两个“日期”间隔,以年、月、日衡量
LocalDate localDate = LocalDate.now();
LocalDate localDate1 = LocalDate.of(2028, 3, 18);
Period period = Period.between(localDate, localDate1);
System.out.println(period);
System.out.println(period.getYears());
System.out.println(period.getMonths());
System.out.println(period.getDays());
Period period1 = period.withYears(2);
System.out.println(period1);
// TemporalAdjuster:时间校正器
// 获取当前日期的下一个周日是哪天?
TemporalAdjuster temporalAdjuster = TemporalAdjusters.next(DayOfWeek.SUNDAY);
LocalDateTime localDateTime = LocalDateTime.now().with(temporalAdjuster);
System.out.println(localDateTime);
// 获取下一个工作日是哪天?
LocalDate localDate = LocalDate.now().with(new TemporalAdjuster() {
@Override
public 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("下一个工作日是:" + localDate);
与传统日期处理的转换

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)