// 想获取2023年10月1日?祝你好运! Date date = new Date(123, 9, 1); // 年份=2023-1900=123,月份从0开始 System.out.println(date.getYear()); // 输出123,当场裂开2. 线程安全的“惊天大雷”
// 堆代码 duidaima.com // 多线程环境下共享一个SimpleDateFormat?直接埋雷! SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); // 线程A:sdf.parse("2023-10-01"); // 线程B:sdf.parse("2024-05-20"); // 结果可能互相覆盖,返回错误日期!3. 时区处理全靠“玄学”
LocalDate date = LocalDate.of(2023, 10, 1); System.out.println(date.getYear()); // 2023!正常了! System.out.println(date.getMonth()); // OCTOBER!感动!2. 不可变性(Immutable)YYDS
LocalDate date1 = LocalDate.now(); LocalDate date2 = date1.plusDays(7); // 返回新对象,date1不变3. 链式调用爽到飞起
// 计算“明年情人节之后第100天的日期” LocalDate result = LocalDate.now() .withYear(2024) // 跳到2024年 .withMonth(2) // 2月 .withDayOfMonth(14) // 14号 .plusDays(100); // 加100天4. 时区处理明明白白
Calendar cal1 = Calendar.getInstance(); cal1.setTime(date1); Calendar cal2 = Calendar.getInstance(); cal2.setTime(date2); long diff = (cal2.getTimeInMillis() - cal1.getTimeInMillis()) / (24 * 60 * 60 * 1000); // 小心闰年!小心夏令时!算错了别怪我!LocalDate版(优雅永不过时):
long diff = ChronoUnit.DAYS.between(date1, date2); // 一行搞定!场景2:判断某个日期是否是闰年
Calendar cal = Calendar.getInstance(); cal.setTime(date); int year = cal.get(Calendar.YEAR); boolean isLeap = ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);LocalDate版(直接开挂):
boolean isLeap = date.isLeapYear(); // 内置方法!四、迁移指南:如何无痛替换Date?
<!-- Maven依赖 --> <dependency> <groupId>org.threeten</groupId> <artifactId>threetenbp</artifactId> <version>1.6.8</version> </dependency>2. 数据库交互:JDBC直接支持
// 写入数据库 preparedStatement.setObject(1, LocalDate.now()); // 读取数据库 LocalDate date = resultSet.getObject("column", LocalDate.class);3. JSON序列化:Jackson一键配置
<dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> </dependency>五、总结:早换早解脱,晚换等着哭
面试时被问日期处理,大谈LocalDate,逼格瞬间拉满!