史上最全日期时间类讲解
SimpleDateFormat的基本使用
1 2 3 4 5 6 7 8 9 10 11 12 | SimpleDateFormat formats = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" );<br> //时间类型转为String类型 Date date = new Date(System.currentTimeMillis()); String dateString = formats.format(date); System.out.println( "dataString----" +dateString);<br> //String类型转为时间类型 String time= "2021-07-07 15:49:42" ; Date date1 = formats.parse(time); System.out.println( "Date----" +date1);<br> //时间类型转成时间戳 Long timeStamp=date1.getTime(); System.out.println( "timeStamp----" +timeStamp); |
输出结果:dataString----2021-07-07 16:10:08
Date----Wed Jul 07 15:49:42 CST 2021
timeStamp----1625644182000
注意 :yyyy-MM-dd HH:mm:ss是时间格式 可修改,比如yyyy-MM-dd;HH:mm:ss;yyyyMMddHHmmss等
new Date()方法中参数是long类型的毫秒值
栗子:获取现在小时
1 2 3 4 5 6 7 8 | public static String getHour() { Date currentTime = new Date(); SimpleDateFormat formatter = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" ); String dateString = formatter.format(currentTime); String hour; hour = dateString.substring( 11 , 13 ); return hour; } |
栗子: 获取两个日期的间隔天数 getTwoDay("2021-07-08","2021-06-20")
1 2 3 4 5 6 7 8 9 10 11 12 | public static String getTwoDay(String day1, String day2) { SimpleDateFormat format = new SimpleDateFormat( "yyyy-MM-dd" ); long day = 0 ; try { java.util.Date bigDate = format.parse(day1); java.util.Date smallDate = format.parse(day2); day = (bigDate.getTime() - smallDate.getTime()) / ( 24 * 60 * 60 * 1000 ); } catch (Exception e) { return "" ; } return day + "" ; } |
Calendar 的基本使用
获取当前时间的年月日时分秒
1 2 3 4 5 6 7 | Calendar cal = Calendar.getInstance(); System.out.println( "年:" + cal.get(Calendar.YEAR)); System.out.println( "月:" + (cal.get(Calendar.MONTH) + 1 )); System.out.println( "日:" + cal.get(Calendar.DAY_OF_MONTH)); System.out.println( "时:" + cal.get(Calendar.HOUR_OF_DAY)); System.out.println( "分:" + cal.get(Calendar.MINUTE)); System.out.println( "秒:" + cal.get(Calendar.SECOND)); |
输出结果:年:2021 月:7 日:7 时:16 分:57 秒:53
注意:月份下标从0开始,所以取月份要+1
栗子:1 月 31 号的时候,月份加一,会出现怎样结果:
1 2 3 4 | Calendar cal = Calendar.getInstance(); cal.set( 2018 , 0 , 31 , 8 , 0 , 0 ); cal.add(Calendar.MONTH, 1 ); System.out.println(cal.getTime()); |
输出结果:Wed Feb 28 08:00:00 CST 2018
注意:Calendar类的getTime()获取当前日期: Wed Feb 28 08:00:00 CST 2018
LocalDateTime,LocalDate,LocalTime的基本使用
LocalDateTime表示日期和时间,LocalDate用来表示日期,LocalTIme表示时间,LocalDateTime = LocalDate + LocalTIme。
1 2 3 | System.out.println(LocalDate.now()); //2020-04-02 System.out.println(LocalTime.now()); //11:29:52.206 System.out.println(LocalDateTime.now()); //2020-04-02T11:29:52.206 |
1、初始化
LocalDateTime可以分别获取LocalDate和LocalTime:
1.toLocalDate 返回LocalDateTime的LocalDate部分
2.toLocalTime 返回LocalDateTime的LocalTime部分
2、获取指定时间
LocalTime.of(int hour,int minute,int second):指定时、分、秒,参数不可缺省
LocalDate.of(int year,MOUTH mouth,int day)
LocalDate.of(int year,int mouth,int day):指定年、月、日,参数不可缺省
这里指定月份的话是从1开始,与Calendar不同,Calendar的月份是从0开始,这也就是LocalDate比Calendar处理时间要方便的多。
LocalDateTime.of(LocalDate localDate,LocalTime localTime)
LocalDateTime.of(nt year,int mouth,int day,int hour,int minute,int second,int nanoOfSecond):指定年、月、日、时、分、秒、纳秒,参数可缺省
1 2 3 4 5 6 7 8 9 10 11 12 | //2020-12-01 System.out.println(LocalDate.of( 2020 , 12 , 1 )); 2020 - 04 - 23 System.out.println(LocalDate.of( 2020 , Month.APRIL, 23 )); 12 : 23 : 33 System.out.println(LocalTime.of( 12 , 23 , 33 )); //2020-04-02T11:48:20.785 System.out.println(LocalDateTime.of(LocalDate.now(),LocalTime.now())); //2322-12-22T23:12:33.000000232 System.out.println(LocalDateTime.of( 2322 , 12 , 22 , 23 , 12 , 33 , 232 )); //2322-07-22T23:12:33.000000232 System.out.println(LocalDateTime.of( 2322 ,Month.JULY, 22 , 23 , 12 , 33 , 232 )); |
3、时间操作
这里以LocalDateTime进行举例说明
说明:1、plus是增加相应时间单位的水量,minus是减少相应时间单位的数量,此处不再说明;
2、表中的拷贝实际就是对相应时间位置的数值进行修改
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | LocalDateTime now = LocalDateTime.now(); System.out.println(now); System.out.println(now.plusYears( 1 ) .plusMonths(1L) .plusWeeks( 1 ) .plusDays( 1 ) .plusHours( 1 ) .plusMinutes( 1 ) .plusSeconds( 1 ) .plusNanos(500000L)); //2020-04-02T12:04:22.507 //2021-05-10T13:05:23.507500 LocalDate date = LocalDate.of( 2020 , 2 , 22 ); // 2020-02-22 LocalDate date1 = date.withYear( 2021 ); // 修改为 2021-02-22 LocalDate date2 = date.withMonth( 3 ); // 修改为 2020-03-22 LocalDate date3 = date.withDayOfMonth( 1 ); // 修改为 2020-02-01 |
4、获取时间属性值
5.时间格式之间相互转换
LocalDateTime与String
1 2 3 4 5 6 7 8 9 10 | DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern( "yyyy年MM月dd日 HH时mm分ss秒SSS毫秒" ); LocalDateTime localDateTime = LocalDateTime.now(); String dateStr = dateTimeFormatter.format(localDateTime); System.out.println(dateStr); \\ 2020 年 04 月 02 日 14 时 11 分 01 秒 623 毫秒<br> LocalDateTime localDateTime2 = LocalDateTime.parse(dateStr, dateTimeFormatter); System.out.println(localDateTime2); \\ 2020 - 04 -02T14: 11 : 01.623 <br> LocalDate localDate = LocalDate.parse(dateStr, dateTimeFormatter); System.out.println(localDate); \\ 2020 - 04 - 02 <br> LocalTime localTime = LocalTime.parse(dateStr, dateTimeFormatter); System.out.println(localTime); \\ 14 : 11 : 01.623 |
时间戳与LocalDate、LocalDateTime之间相互转换
1 2 3 4 5 6 7 8 9 | long timestamp = Instant.now().toEpochMilli(); LocalDateTime localDateTime = Instant.ofEpochMilli(timestamp).atOffset(ZoneOffset.ofHours( 8 )).toLocalDateTime(); System.out.println(timestamp + "====>" + localDateTime );<br> timestamp = localDateTime.toInstant(ZoneOffset.ofHours( 8 )).toEpochMilli(); System.out.println(localDateTime + "====>" + timestamp );<br> // 注意秒和毫秒之间的区别 timestamp = LocalDateTime.now().atZone(ZoneOffset.ofHours( 8 )).toEpochSecond(); localDateTime = Instant.ofEpochSecond(timestamp).atOffset(ZoneOffset.ofHours( 8 )).toLocalDateTime(); System.out.println(timestamp + "====>" + localDateTime ); |
Date与LocalDate、LocalDateTime之间相互转换
1 2 3 4 5 6 7 8 | LocalDateTime localDateTime = LocalDateTime.now(); System.out.println(localDateTime);<br> Date date = Date.from(localDateTime.atZone(ZoneOffset.ofHours( 8 )).toInstant()); localDateTime = date.toInstant().atZone(ZoneOffset.ofHours( 8 )).toLocalDateTime(); System.out.println(date + "======>" + localDateTime); //2020-04-02T14:27:40.230 //Thu Apr 02 14:27:40 CST 2020======>2020-04-02T14:27:40.230 |
6.其他方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | LocalDateTime now = LocalDateTime.now(); System.out.println( "当前时间:" + now); LocalDateTime from = LocalDateTime.of( 2020 , 4 , 1 , 0 , 0 , 0 , 0 ); System.out.println(from.until(now, ChronoUnit.HOURS)); /*打印结果: 当前时间:2020-04-03T14:40:39.048 62 */ LocalDateTime date = LocalDateTime.parse( "2014-12-03T10:15:30" ); System.out.printf( "LocalDateTime precision is %s%n" , zonedDateTime.query(TemporalQueries.precision())); /*打印结果: LocalDateTime precision is Nanos */ ZonedDateTime date = ZonedDateTime.now(); System.out.println(date); LocalTime standard = LocalTime.parse( "10:30:30" ); date = (ZonedDateTime)standard.adjustInto(date); System.out.println(date); /*打印结果: 2020-04-03T15:03:31.579+08:00[Asia/Shanghai] 2020-04-03T10:30:30+08:00[Asia/Shanghai] */ |
7.Instant(时间点)
Instant是时间线上的一个点,表示一个时间戳。Instant可以精确到纳秒,这超过了long的最大表示范围,所以在Instant的实现中是分成了两部分来表示,一部分是seconds,表示从1970-01-01 00:00:00开始到现在的秒数,另一个部分是nanos,表示纳秒部分。以下是创建Instant的两种方法:
1 2 3 4 5 | Instant now = Instant.now(); //获取当前时刻的时间戳,结果为:2020-04-02T07:30:23.811Z; Instant instant = Instant.ofEpochSecond( 600 , 1000000 ); //ofEpochSecond()方法的第一个参数为秒,第二个参数为纳秒,上面的代码表示从1970-01-01 00:00:00开始后一分钟的10万纳秒的时刻, //其结果为:1970-01-01T00:10:00.001Z。 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程