news 2026/10/23 9:43:30

HoRain云--Java日期时间API完全指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HoRain云--Java日期时间API完全指南

Java 8之前的Date、Calendar线程不安全、设计混乱。Java 8引入的java.time包彻底解决了这些问题。本文系统讲解新日期时间API。

一、核心类

类用途
LocalDate日期
LocalTime时间
LocalDateTime日期+时间
ZonedDateTime带时区
Instant时间戳
Duration时间间隔
Period日期间隔
DateTimeFormatter格式化

二、创建与操作

java

复制

下载

LocalDate date = LocalDate.now(); LocalDate date2 = LocalDate.of(2024, 1, 1); LocalDate parsed = LocalDate.parse("2024-01-01"); LocalTime time = LocalTime.now(); LocalTime time2 = LocalTime.of(10, 30, 0); LocalDateTime dt = LocalDateTime.now(); LocalDateTime dt2 = LocalDateTime.of(2024, 1, 1, 10, 30); // 操作 LocalDate tomorrow = date.plusDays(1); LocalDate lastMonth = date.minusMonths(1); LocalDate withYear = date.withYear(2025); // 获取字段 date.getYear(); date.getMonth(); // Month枚举 date.getMonthValue(); // 1-12 date.getDayOfWeek(); // DayOfWeek枚举 date.getDayOfMonth(); date.lengthOfMonth(); date.isLeapYear();

三、时间戳与Instant

java

复制

下载

Instant now = Instant.now(); long epochMilli = now.toEpochMilli(); Instant fromMilli = Instant.ofEpochMilli(1704067200000L); LocalDateTime dt = LocalDateTime.ofInstant(fromMilli, ZoneId.systemDefault());

四、时区

java

复制

下载

ZoneId zone = ZoneId.of("Asia/Shanghai"); ZonedDateTime zdt = ZonedDateTime.now(zone); // 时区转换 ZonedDateTime ny = zdt.withZoneSameInstant(ZoneId.of("America/New_York")); System.out.println(ny); // 所有可用时区 ZoneId.getAvailableZoneIds().forEach(System.out::println);

五、格式化

java

复制

下载

DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); String s = LocalDateTime.now().format(fmt); LocalDateTime dt = LocalDateTime.parse("2024-01-01 10:30:00", fmt); // 预定义格式 DateTimeFormatter.ISO_LOCAL_DATE DateTimeFormatter.ISO_DATE_TIME // 本地化 DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL) .withLocale(Locale.CHINA);

六、Duration与Period

java

复制

下载

// Duration:时间间隔 Duration d = Duration.between( LocalTime.of(10, 0), LocalTime.of(12, 30)); System.out.println(d.toMinutes()); // 150 // Period:日期间隔 Period p = Period.between( LocalDate.of(2024, 1, 1), LocalDate.of(2024, 3, 15)); System.out.println(p.getMonths() + "个月" + p.getDays() + "天"); // ChronoUnit long days = ChronoUnit.DAYS.between(start, end); long hours = ChronoUnit.HOURS.between(t1, t2);

七、与旧API转换

java

复制

下载

// Date -> Instant Date date = new Date(); Instant instant = date.toInstant(); // Instant -> Date Date fromInstant = Date.from(instant); // Calendar -> ZonedDateTime Calendar cal = Calendar.getInstance(); ZonedDateTime zdt = ZonedDateTime.ofInstant( cal.toInstant(), cal.getZone()); // LocalDateTime <-> Date Date d = Date.from(dt.atZone(ZoneId.systemDefault()).toInstant()); LocalDateTime ldt = LocalDateTime.ofInstant(d.toInstant(), ZoneId.systemDefault());

八、实战:日期工具类

java

复制

下载

public class DateUtils { public static final DateTimeFormatter DATE_FMT = DateTimeFormatter.ofPattern("yyyy-MM-dd"); public static final DateTimeFormatter DATETIME_FMT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); public static String format(LocalDateTime dt) { return dt == null ? "" : dt.format(DATETIME_FMT); } public static LocalDateTime parse(String s) { return LocalDateTime.parse(s, DATETIME_FMT); } public static long daysBetween(LocalDate a, LocalDate b) { return ChronoUnit.DAYS.between(a, b); } public static boolean isSameDay(LocalDateTime a, LocalDateTime b) { return a.toLocalDate().equals(b.toLocalDate()); } public static LocalDateTime startOfDay(LocalDate date) { return date.atStartOfDay(); } public static LocalDateTime endOfDay(LocalDate date) { return date.atTime(LocalTime.MAX); } public static boolean isWeekend(LocalDate date) { DayOfWeek dow = date.getDayOfWeek(); return dow == DayOfWeek.SATURDAY || dow == DayOfWeek.SUNDAY; } }

九、注意事项

  1. 线程安全:java.time全部不可变,线程安全。

  2. 不要用==比较:用equals或isEqual。

  3. 时区问题:数据库存UTC,展示转本地。

  4. MySQL映射:DATETIME对应LocalDateTime,TIMESTAMP对应Instant。

  5. Jackson序列化:配置JavaTimeModule。

java

复制

下载

@Bean public ObjectMapper objectMapper() { ObjectMapper mapper = new ObjectMapper(); mapper.registerModule(new JavaTimeModule()); mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); return mapper; }

十、总结

java.time设计优雅、线程安全。掌握LocalDateTime、ZonedDateTime、Duration、DateTimeFormatter,能应对几乎所有日期时间场景。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/22 20:16:06

MATLAB仿真小电流接地系统单相故障建模实践

1. 项目背景与核心价值在配电网运行中&#xff0c;小电流接地系统&#xff08;包括不接地系统和经消弧线圈接地系统&#xff09;因其供电可靠性高、接地故障电流小的特点&#xff0c;被广泛应用于6-35kV电压等级的电网中。但这类系统在发生单相接地故障时&#xff0c;故障特征不…

作者头像 李华
网站建设 2026/10/23 5:37:54

B树从理论到实践:数据库索引背后的核心数据结构

很多人在学数据结构时&#xff0c;走到树这一章就开始犯怵。二叉树还好说&#xff0c;递归遍历、增删查改&#xff0c;画个图总能想明白。可一旦看到B树、B树&#xff0c;不少人的第一反应是&#xff1a;这玩意儿到底有什么用&#xff1f;感觉就是一堆莫名其妙的节点分裂和合并…

作者头像 李华
网站建设 2026/10/23 22:18:34

GitHub现在可以在推送时阻止另外两种人类按键类型这是它仍然错过的

你的编码代理完成一项任务&#xff0c;用git add -A&#xff0c;并推动。提交中某处是一个.env文件中有一个Anthropic API密钥。 自10月13日以来&#xff0c;GitHub有更好的机会阻止这一推波助澜。A日期为2026年10月13日的GitHub变更日志条目说秘密扫描现在检测到两种新的人类…

作者头像 李华
网站建设 2026/10/24 5:20:34

Next.js + Node中带有分支级RBAC的多租户SaaS一个实用的架构

关键要点 从会话中解析租户&#xff0c;而不是从请求中解析。URL段或标题可以选择哪个但服务器必须验证该成员资格。 Next.js中间件是大门&#xff0c;不是门卫。把它用于重定向和廉价支票&#xff1b;在节点API或服务器代码中&#xff0c;在数据旁边进行真正的授权。 每个服务…

作者头像 李华
网站建设 2026/10/23 22:28:34

视频剪辑自学路径与核心技能全解析

1. 视频剪辑自学路径全解析第一次打开剪辑软件时&#xff0c;我被密密麻麻的时间线和各种陌生图标吓到了。但三个月后&#xff0c;我制作的旅行vlog在朋友圈获得了上百个赞。这段自学经历让我明白&#xff0c;视频剪辑就像学骑自行车——开始会摔几次&#xff0c;但掌握平衡后就…

作者头像 李华