目录
一、util包.Date类——第一代日期类
二、SimpleDateFormat——日期时间格式化
1.日期时间转换成字符串
2.字符串转换成日期时间
三、Calendar日历类——第二代日期类
1.Calendar类中常用的静态方法
2.设置指定的字段(不常用)
3.calendar.setTime()使用案例——获取字符串时间是一年中的第几天
四、前两代日期类的不足分析
五、LocalDate(日期)、LocalTime(时间)、LocalDateTime(日期时间)——第三代日期类(JDK8加入)
(一)LocalDate类——只有日期(年月日),没有时间(时分秒)
1.常用方法
2.LocalDate和String的相互转换
2.1日期时间格式转换器——DateTimeFormatter
2.2将日期转换成字符串
2.3将字符串转换成日期
(二)LocalTime类——只有时间(时分秒纳秒),没有日期(年月日)
1.常用方法
2.LocalTime和String的相互转换
2.1将时间转换成字符串
2.2将字符串转换成时间
(三)LocalDateTime类——有日期时间毫秒
1.常用方法
2.LocalDateTime和String的相互转换
2.1将日期时间转换为字符串
2.2将字符串转换为日期时间
(四)Instant类——时间戳,精确到纳秒
1.修改时区
2.Instant与Date相互转化
3.Instant的until方法——获取两个时间的差值
4.将Instant转换成LocalDateTime类型
(五)间隔相关的日期类——Period和Duration
1.Period——计算日期间隔
2.Duration——计算时间间隔
3.第三代日期类更多方法
一、util包.Date类——第一代日期类
Date:精确到毫秒,代表特定的瞬间
对于日期时间的操作:
Date date = new Date();
System.out.println(date); // Fri Sep 20 22:14:05 CST 2024
Date date1 = new Date(1000L);
System.out.println(date1); // Thu Jan 01 08:00:01 CST 1970
// 计算机元年在中国是 1970年1月1日早上8点
// 设置计算机元年之后的时间
date.setTime(1000L);
System.out.println(date); // Thu Jan 01 08:00:01 CST 1970
Date date = new Date();
System.out.println(date); // Fri Sep 20 22:17:43 CST 2024
// 获取计算机元年(1970年1月1日早上8点)到现在的毫秒值
System.out.println(date.getTime()); // 1726841863209
// 毫秒值转换为日期时间
Date date2 = new Date(1726841863209L);
System.out.println(date2); // Fri Sep 20 22:17:43 CST 2024
二、SimpleDateFormat——日期时间格式化
1.日期时间转换成字符串
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
SimpleDateFormat simpleDateFormat = new SimpleDateFormat();
String format = simpleDateFormat.format(new Date());
System.out.println(format); // 2024/9/20 下午10:18
SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String format1 = simpleDateFormat1.format(new Date());
System.out.println(format1); // 2024年09月20日 22:18:30
SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss.SSS E a");
String format2 = simpleDateFormat2.format(new Date());
System.out.println(format2); // 2024年09月20日 22:18:30.744 周五 下午
// 创建一个SimpleDateFormat对象,用于指定输出格式为星期几
SimpleDateFormat sdf = new SimpleDateFormat("EEEE", Locale.getDefault());
String weekDay = sdf.format(new Date());
// 输出星期几
System.out.println("今天是:" + weekDay); // 今天是:星期五
2.字符串转换成日期时间
注意要抛异常
public static void main(String[] args) throws ParseException {
String str = "2035年10月1日 12:12:12 星期一";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月d日 HH:mm:ss E");
Date date = simpleDateFormat.parse(str);
System.out.println(date);
// Mon Oct 01 12:12:12 CST 2035
// 1. SimpleDateFormat可以把一个格式化的String 转成对应的 Date
// 2. 得到Date仍然在输出时,还是按照国外的形式,如果希望指定格式输出,需要转换
// 3. 在把String -> Date , 使用的 sdf 格式需要和你给的String的格式一样,否则会抛出转换异常
System.out.println(simpleDateFormat.format(date));
// 2035年10月1日 12:12:12 星期一
}
三、Calendar日历类——第二代日期类
1.Calendar类中常用的静态方法
Calendar.getInstance()方法是Java中Calendar类的一个静态方法,用于获取一个表示当前时间的Calendar对象。
Calendar是一个抽象类,并且构造器是private;可以通过getInstance()来获取实例;提供了大量的方法和字段:
// 日历类 获取默认时区的日历
Calendar c = Calendar.getInstance();
System.out.println(c);
// java.util.GregorianCalendar[time=1727331839843,areFieldsSet=true,
// areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo
// [id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,
// transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,
// ERA=1,YEAR=2024,MONTH=8,WEEK_OF_YEAR=39,WEEK_OF_MONTH=4,DAY_OF_MONTH=26,
// DAY_OF_YEAR=270,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=4,AM_PM=1,HOUR=2,
// HOUR_OF_DAY=14,MINUTE=23,SECOND=59,MILLISECOND=843,ZONE_OFFSET=28800000,
// DST_OFFSET=0]
System.out.println("年:" + c.get(Calendar.YEAR)); // 2024
//这里为什么要+1,因为Calendar返回月时候,是按照0开始编号
System.out.println("月:" + (c.get(Calendar.MONTH) + 1)); // 9
System.out.println("星期:" + c.get(Calendar.WEDNESDAY)); // 4
System.out.println("当月的第几周:" + c.get(Calendar.WEEK_OF_MONTH)); // 4
System.out.println("日:" + c.get(Calendar.DAY_OF_MONTH)); // 26
System.out.println("12小时制:" + c.get(Calendar.HOUR)); // 2
System.out.println("24小时制:" + c.get(Calendar.HOUR_OF_DAY)); // 2
System.out.println("分钟:" + c.get(Calendar.MINUTE)); // 16
System.out.println("秒:" + c.get(Calendar.SECOND)); // 38
System.out.println("毫秒:" + c.get(Calendar.MILLISECOND)); // 361
System.out.println("当年的第几天:" + c.get(Calendar.DAY_OF_YEAR)); // 270
//4.Calendar没有提供对应的格式化的类,因此需要自己组合来显示
System.out.println(c.get(Calendar.YEAR) + "年" + (c.get(Calendar.MONTH) + 1) + "月"
+ c.get(Calendar.DAY_OF_MONTH) + "日 " + c.get(Calendar.HOUR_OF_DAY) + ":"
+ c.get(Calendar.MINUTE) + ":" + c.get(Calendar.SECOND)); // 2024年9月26日 14:20:24
2.设置指定的字段(不常用)
calendar.set(Calendar.YEAR,2050);
calendar.set(2050,9,1,12,0,0);
3.calendar.setTime()使用案例——获取字符串时间是一年中的第几天
String str = "2050-10-1 12:12:12";
// 1.把字符串转换成日期
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = simpleDateFormat.parse(str); // 注意要抛异常
// 2.Calendar类中传入格式化后的日期时间
Calendar calendar1 = Calendar.getInstance(); // 获取当前时间的Calendar对象
calendar1.setTime(date);
System.out.println(calendar1); // 打印日历
// java.util.GregorianCalendar[time=2548210332000,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=31,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2050,MONTH=9,WEEK_OF_YEAR=40,WEEK_OF_MONTH=1,DAY_OF_MONTH=1,DAY_OF_YEAR=274,DAY_OF_WEEK=7,DAY_OF_WEEK_IN_MONTH=1,AM_PM=1,HOUR=0,HOUR_OF_DAY=12,MINUTE=12,SECOND=12,MILLISECOND=0,ZONE_OFFSET=28800000,DST_OFFSET=0]
// 3.判断该时间是当年的第几天
int dayOfYear1 = calendar1.get(Calendar.DAY_OF_YEAR);
System.out.println(dayOfYear1); // 274
四、前两代日期类的不足分析
JDK1.0中包含了一个java.util.Date类,但是它的大多数方法已经在JDK1.1引入Calendar类之后被弃用了。而Calendar存在的问题:
- 可变性:像日期和时间这样的类应该是不可变的;
- 偏移性:Date中的年份是从1900开始的,而月份都从0开始
- 格式化:格式化只针对Date有用,Calendar则不行
- 此外,它们也不是线程安全的;不能处理闰秒等(每隔2天,多出1s)
五、LocalDate(日期)、LocalTime(时间)、LocalDateTime(日期时间)——第三代日期类(JDK8加入)
开发中推荐使用第三代日期类
(一)LocalDate类——只有日期(年月日),没有时间(时分秒)
1.常用方法
// 获取当前时间
LocalDate date = LocalDate.now();
System.out.println(date); // 2024-09-21
// 手动指定日期
// LocalDate date1 = LocalDate.of(2050, 9, 21);
// System.out.println(date1); // 2050-09-21
// 添加天数
// date = date.plusDays(3);
// System.out.println(date); // 2024-09-24
// 添加周的天数,一次性7天
// date = date.plusWeeks(1);
// System.out.println(date); // 2024-09-28
// 添加月
// date = date.plusMonths(2);
// System.out.println(date); // 2024-11-21
// 添加年
// date = date.plusYears(2);
// System.out.println(date); // 2026-09-21
// 自定义添加天数
LocalDate localDate = date.plus(3, ChronoUnit.DAYS);
System.out.println(localDate); // 2024-09-24
++++++++++++++++++++减少也是同理+++++++++++++++++++++++
// 减少日期
// 减少天
// date.minusDays();
// 减少月
// date.minusMonths();
// 减少周
// date.minusWeeks();
// 减少年
// date.minusYears();
2.LocalDate和String的相互转换
2.1日期时间格式转换器——DateTimeFormatter
LocalDate date = LocalDate.now();
System.out.println(date); // 2024-09-21
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
2.2将日期转换成字符串
String format = dateTimeFormatter.format(date);
System.out.println(format); // 2024年09月21日
2.3将字符串转换成日期
String str = "2024年09月21日";
DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
LocalDate localDate = LocalDate.parse(str, dateTimeFormatter1);
System.out.println(localDate); // 2024-09-21
(二)LocalTime类——只有时间(时分秒纳秒),没有日期(年月日)
1.常用方法
// 获取当前时间,精确到纳秒
// LocalTime localTime = LocalTime.now();
// System.out.println(localTime); // 19:32:41.840327800
// 指定时间
// LocalTime time = LocalTime.of(18, 0, 10);
// System.out.println(time); // 18:00:10
// 添加时间
// 添加小时
// time.plusHours(3);
// 添加分钟
// time.plusMinutes(10);
// 添加秒
// time.plusSeconds(50);
// 添加纳秒
// time.plusNanos();
// 使用枚举添加时间
LocalTime localTime1 = LocalTime.now();
System.out.println(localTime1); // 19:32:41.840327800
localTime1 = localTime1.plus(3, ChronoUnit.HOURS);
System.out.println(localTime1); // 22:31:33.953687700
// 减时间
// 减少小时
LocalTime time = localTime1.minus(4, ChronoUnit.HOURS);
System.out.println(time); // 18:35:43.754074800
// localTime1.minusHours();
// 减少分钟
// localTime1.minusMinutes();
// 减少秒
// localTime1.minusSeconds();
// 减少纳秒
// localTime1.minusNanos();
2.LocalTime和String的相互转换
2.1将时间转换成字符串
时间转换器和上面的一样,也是DateTimeFormatter。
// LocalTime类的时间与String相互转换
LocalTime localTime = LocalTime.now();
System.out.println(localTime); // 19:54:30.234495100
// 日期时间格式转换器
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("HH-mm-ss-SSS");
// 时间转换成String
String str = dateTimeFormatter.format(localTime);
System.out.println(str); // 19-54-30-234
2.2将字符串转换成时间
String time = "19-48-49-616";
DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("HH-mm-ss-SSS");
LocalTime strTime = LocalTime.parse(time, dateTimeFormatter1);
System.out.println(strTime); // 19:48:49.616
(三)LocalDateTime类——有日期时间毫秒
1.常用方法
// 获取当前日期时间
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime); // 2024-09-26T14:53:33.392
System.out.println("年=" + localDateTime.getYear()); // 2024
System.out.println("月=" + localDateTime.getMonth()); // SEPTEMBER
System.out.println("月=" + localDateTime.getMonthValue()); // 9
System.out.println("日=" + localDateTime.getDayOfMonth()); // 26
System.out.println("时=" + localDateTime.getHour()); // 14
System.out.println("分=" + localDateTime.getMinute()); // 53
System.out.println("秒=" + localDateTime.getSecond()); // 33
// 指定日期时间
LocalDateTime dateTime = LocalDateTime.of(2050, 3, 10, 12, 10, 15);
System.out.println(dateTime); // 2050-03-10T12:10:15
// 添加日期时间
localDateTime = localDateTime.plus(3, ChronoUnit.CENTURIES);
System.out.println(localDateTime); // 2324-09-21T20:04:23.286008100
// 减少日期时间
localDateTime = localDateTime.minus(1, ChronoUnit.CENTURIES);
System.out.println(localDateTime); // 2224-09-21T20:04:23.286008100
LocalDateTime ldt = LocalDateTime.now();
System.out.println(ldt); // 2024-09-26T15:16:28.053
// 日期格式化:
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// 添加指定的天数:
LocalDateTime localDateTime = ldt.plusDays(890);
// 格式化输出:
String format = dateTimeFormatter.format(localDateTime);
System.out.println("890天后 日期=" + format); // 890天后 日期=2027-03-05 15:15:29
// 减少指定的时间:
LocalDateTime localDateTime1 = ldt.minusMinutes(3456);
// 格式化输出:
String format1 = dateTimeFormatter.format(localDateTime1);
System.out.println("2456分钟前 日期=" + format1); // 2456分钟前 日期=2024-09-24 05:39:29
2.LocalDateTime和String的相互转换
2.1将日期时间转换为字符串
时间转换器和上面的一样,也是DateTimeFormatter。
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime); // 2024-09-21T20:06:38.060533700
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss:SSS");
String str = dateTimeFormatter.format(localDateTime);
System.out.println(str); // 2024年09月21日 20:06:38:060
2.2将字符串转换为日期时间
String str = "2024年09月21日 20:06:38:060";
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss:SSS");
LocalDateTime localDateTime = LocalDateTime.parse(str, dateTimeFormatter);
System.out.println(localDateTime); // 2024-09-21T20:06:38.060
(四)Instant类——时间戳,精确到纳秒
1.修改时区
// 获取当前的世界时间
Instant now = Instant.now();
System.out.println(now); // 2024-09-21T12:29:55.112482500Z
// 获取当前的北京时间
Instant now1 = Instant.now(Clock.offset(Clock.systemUTC(), Duration.ofHours(8)));
System.out.println(now1); // 2024-09-21T20:29:55.120461200Z
// 将当前的北京时间添加8小时
now1 = now1.plus(8, ChronoUnit.HOURS);
System.out.println(now1); // 2024-09-22T04:29:55.120461200Z
2.Instant与Date相互转化
public static void main(String[] args) throws ParseException {
// 静态方法now() 获取表示当前时间戳的对象
Instant now = Instant.now();
System.out.println(now);
// 时间戳转为Date格式
Date date = Date.from(now);
System.out.println(date);
// Date转为Instant时间戳
Instant instant = date.toInstant();
System.out.println(instant);
}
3.Instant的until方法——获取两个时间的差值
Instant.now(Clock.offset(Clock.systemUTC(), Duration.ofHours(8)));
// until方法:比较两个时间之间的差值
Instant now = Instant.now();
System.out.println(now); // 2024-09-21T12:47:53.622092Z
Instant nowPlus = now.plus(8, ChronoUnit.HOURS);
System.out.println(nowPlus); // 2024-09-21T20:47:53.622092Z
long duration = now.until(nowPlus, ChronoUnit.HOURS);
System.out.println(duration); // 8
// 获取毫秒
System.out.println(now.get(ChronoField.MILLI_OF_SECOND)); // 622
// 获取微秒
System.out.println(now.get(ChronoField.MICRO_OF_SECOND)); // 622092
// 获取纳秒
System.out.println(now.get(ChronoField.NANO_OF_SECOND)); // 622092000
4.将Instant转换成LocalDateTime类型
// ZoneId.systemDefault() 默认时区
LocalDateTime localDateTime = LocalDateTime.ofInstant(now, ZoneId.systemDefault());
System.out.println(localDateTime); // 2024-09-21T20:47:53.622092
(五)间隔相关的日期类——Period和Duration
1.Period——计算日期间隔
// 计算日期间隔
public static void demo3() {
LocalDate d1 = LocalDate.now();
LocalDate d2 = LocalDate.of(2050, 10, 23);
Period between = Period.between(d1, d2);
System.out.println("相差的年数:" + Math.abs(between.getYears())); // 26
System.out.println("相差的月数:" + Math.abs(between.getMonths())); // 0
System.out.println("相差的天数:" + Math.abs(between.getDays())); // 21
System.out.println("----------------");
long yearsBetween = ChronoUnit.YEARS.between(d1, d2);
System.out.println("相差的年数:" + yearsBetween); // 26
long monthsBetween = ChronoUnit.MONTHS.between(d1, d2);
System.out.println("相差的月数:" + monthsBetween); // 312
long daysBetween = ChronoUnit.DAYS.between(d1, d2);
System.out.println("相差的天数:" + daysBetween); // 9517
System.out.println("--------------------");
// Period.between用法举例
LocalDate birthDate = LocalDate.of(1990, 2, 10);
LocalDate today = LocalDate.now();
Period age = Period.between(birthDate, today);
System.out.println("Age: " + age.getYears() + " years, " + age.getMonths()
+ " months, " + age.getDays() + " days");
// 通常情况下,我们只需要年份,月份和天数可以忽略或进行适当处理
System.out.println("Age in years: " + age.getYears());
LocalDate fiscalYearStart = LocalDate.of(2023, 7, 1);
LocalDate fiscalYearEnd = LocalDate.of(2024, 6, 30);
Period fiscalYearDuration = Period.between(fiscalYearStart, fiscalYearEnd);
System.out.println("Fiscal year duration: " + fiscalYearDuration.getYears() + " years, "
+ fiscalYearDuration.getMonths() + " months, "
+ fiscalYearDuration.getDays() + " days");
}
2.Duration——计算时间间隔
public static void demo4() {
LocalDateTime t1 = LocalDateTime.now();
System.out.println(t1);
LocalDateTime t2 = LocalDateTime.of(2024, 12, 8, 0, 0, 0);
System.out.println(t2);
Duration duration = Duration.between(t1, t2);
System.out.println("相差的总天数" + duration.toDays());
System.out.println("相差的总小时数" + duration.toHours());
System.out.println("相差的总分钟数" + duration.toMinutes());
// System.out.println("相差的总秒数" + duration.toSeconds()); jdk9+
}
3.第三代日期类更多方法
MonthDay类:检查重复事件
是否是闰年
增加日期的某个部分等