一、为什么说date已经过时?
在java 8之前,我们一直在使用java.util.date
和java.util.calendar
处理日期时间,但这些类存在诸多设计缺陷:
// 反人类设计的经典示例 date date = new date(122, 10, 21); // 实际表示:2022年11月21日(年份基准是1900,月份从0开始)
二、localdate核心特性解析
1. 创建日期对象
// 获取当前日期(无时区概念,基于系统时钟) localdate today = localdate.now(); // 指定具体日期(月份使用枚举,避免数值歧义) localdate nationalday = localdate.of(2023, month.october, 1); // 解析标准iso格式字符串(yyyy-mm-dd) localdate parseddate = localdate.parse("2023-08-15");
2. 日期格式化与解析
// 创建线程安全的格式化器(推荐重用实例) datetimeformatter formatter = datetimeformatter .ofpattern("yyyy年mm月dd日") // 定义格式模板 .withlocale(locale.china); // 指定地区设置 // 格式化日期对象 → 字符串 string formatted = nationalday.format(formatter); // 输出:"2023年10月01日" // 解析字符串 → 日期对象 localdate date = localdate.parse("2023年10月01日", formatter);
3. 日期计算(链式api)
// 基础计算(返回新对象,原对象不变) localdate tomorrow = today.plusdays(1); // 加1天 localdate prevmonth = today.minusmonths(1); // 减1个月 // 使用时间调节器(temporaladjusters) localdate firstdayofmonth = today.with(temporaladjusters.firstdayofmonth()); localdate nextmonday = today.with(temporaladjusters.next(dayofweek.monday));
4. 日期比较与信息获取
// 比较日期先后 boolean isafter = today.isafter(nationalday); // 判断闰年(基于iso日历系统) boolean isleapyear = today.isleapyear(); // 获取星期枚举(monday-sunday) dayofweek dayofweek = today.getdayofweek();
5. 时间段计算(period类)
// 计算两个日期之间的差值 localdate start = localdate.of(2023, 1, 1); localdate end = localdate.of(2023, 12, 31); period period = period.between(start, end); // 格式化输出时间段 system.out.printf("相差:%d年%d个月%d天", period.getyears(), // 年差 period.getmonths(), // 月差 period.getdays()); // 日差
三、与date的互操作
1. localdate → date(需指定时间)
// 转换为当天的零点时刻(系统默认时区) zoneddatetime zdt = today.atstartofday(zoneid.systemdefault()); date olddate = date.from(zdt.toinstant());
2. date → localdate(时区敏感)
date date = new date(); // 转换步骤:date → instant → zoneddatetime → localdate localdate localdate = date.toinstant() // 转为时间戳 .atzone(zoneid.systemdefault()) // 附加时区信息 .tolocaldate(); // 提取日期部分
四、最佳实践与常见问题
1. 时区处理原则
场景 | 推荐类 | 说明 |
---|---|---|
生日、纪念日 | localdate | 无时区概念 |
跨时区会议时间 | zoneddatetime | 明确时区信息 |
服务器日志时间 | instant | 时间戳,绝对时间 |
2. 数据库交互(jpa示例)
@entity public class user { @column(name = "birth_date") private localdate birthdate; // 直接映射为date类型 @column(name = "create_time") private localdatetime createtime; // 映射为timestamp }
3. 日期格式模式符速查表
符号 | 说明 | 示例 |
---|---|---|
y | 年份 | 2023 |
m | 月份 | 7 (数字) / july (文本) |
d | 日期 | 5 |
e | 星期 | 星期一 / mon |
q | 季度 | q3 |
五、为什么推荐localdate?
线程安全:所有对象不可变,无需担心并发修改
清晰api:方法名自解释(如
plusdays()
vscalendar.add()
)精确类型:
localdate
:2023-08-15localtime
:14:30:00localdatetime
:2023-08-15t14:30
iso标准:默认遵循iso-8601,避免格式歧义
六、迁移路线图(图示建议)
七、常见问题解答
q:如何处理农历日期?
// 使用三方库如lunardate lunardate lunardate = lunardate.fromsolar(2023, 8, 15); localdate solardate = lunardate.tosolar();
q:如何计算两个日期间的工作日?
long workdays = start.datesuntil(end) .filter(date -> date.getdayofweek().getvalue() < 6) .count();
以上就是java利用localdate进行日期处理的完全指南的详细内容,更多关于java localdate日期处理的资料请关注代码网其它相关文章!
发表评论