史上最全日期时间类讲解

SimpleDateFormat的基本使用

SimpleDateFormat formats = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//时间类型转为String类型 Date date = new Date(System.currentTimeMillis()); String dateString = formats.format(date); System.out.println("dataString----"+dateString);
//String类型转为时间类型 String time="2021-07-07 15:49:42"; Date date1 = formats.parse(time); System.out.println("Date----"+date1);
//时间类型转成时间戳 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类型的毫秒值

栗子:获取现在小时

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")

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 的基本使用

获取当前时间的年月日时分秒

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 号的时候,月份加一,会出现怎样结果:

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。

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):指定年、月、日、时、分、秒、纳秒,参数可缺省

//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、表中的拷贝实际就是对相应时间位置的数值进行修改

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
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毫秒
LocalDateTime localDateTime2 = LocalDateTime.parse(dateStr, dateTimeFormatter); System.out.println(localDateTime2); \ 2020-04-02T14:11:01.623
LocalDate localDate = LocalDate.parse(dateStr, dateTimeFormatter); System.out.println(localDate); \2020-04-02
LocalTime localTime = LocalTime.parse(dateStr, dateTimeFormatter); System.out.println(localTime); \14:11:01.623
时间戳与LocalDate、LocalDateTime之间相互转换
long timestamp = Instant.now().toEpochMilli();
LocalDateTime localDateTime = Instant.ofEpochMilli(timestamp).atOffset(ZoneOffset.ofHours(8)).toLocalDateTime();
System.out.println(timestamp +"====>"+ localDateTime );
timestamp = localDateTime.toInstant(ZoneOffset.ofHours(8)).toEpochMilli(); System.out.println(localDateTime +"====>"+ timestamp );
// 注意秒和毫秒之间的区别 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之间相互转换
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime);
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.其他方法

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的两种方法:

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。
我话讲完!谁赞成?谁反对?
原文地址:https://www.cnblogs.com/wffzk/p/13789389.html