梧州市网站建设_网站建设公司_定制开发_seo优化
2026/1/16 6:40:07 网站建设 项目流程

网罗开发(小红书、快手、视频号同名)

大家好,我是展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。

图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享嘉宾
科技博主:华为HDE/HDG

我的博客内容涵盖广泛,主要分享技术教程、Bug解决方案、开发工具使用、前沿科技资讯、产品评测与使用体验。我特别关注云服务产品评测、AI 产品对比、开发板性能测试以及技术报告,同时也会提供产品优缺点分析、横向对比,并分享技术沙龙与行业大会的参会体验。我的目标是为读者提供有深度、有实用价值的技术洞察与分析。

展菲:您的前沿技术领航员
👋 大家好,我是展菲!
📱 全网搜索“展菲”,即可纵览我在各大平台的知识足迹。
📣 公众号“Swift社区”,每周定时推送干货满满的技术长文,从新兴框架的剖析到运维实战的复盘,助您技术进阶之路畅通无阻。
💬 微信端添加好友“fzhanfei”,与我直接交流,不管是项目瓶颈的求助,还是行业趋势的探讨,随时畅所欲言。
📅 最新动态:2025 年 3 月 17 日
快来加入技术社区,一起挖掘技术的无限潜能,携手迈向数字化新征程!


文章目录

    • 前言
    • 问题背景:时间看着对,结果却不对
    • 问题根因:Date 和 LocalDateTime 本质就不是一类东西
      • Date 的问题,不只是“老”
      • LocalDateTime 的问题,是“你以为它会自动懂你”
    • 正确做法:明确告诉系统“你给我的是什么格式”
      • 使用 DateTimeFormatter 显式定义格式
    • 可运行 Demo:字符串 → LocalDateTime
      • 示例代码
      • 输出结果
    • 再进一步:LocalDateTime 和 Date 如何互转
      • LocalDateTime → Date
      • Date → LocalDateTime
    • 实际项目中的推荐写法
      • 接口层:统一用字符串
      • 业务层:统一用 LocalDateTime
      • 数据库存储:看场景
    • 为什么推荐 LocalDateTime,而不是 Date
    • 总结

前言

在日常开发中,时间处理几乎是绕不开的坑
尤其是当你在项目里同时看到DateLocalDateTime、字符串时间格式混着用的时候,基本可以预见:
迟早会出问题。

最近在一个业务里就踩到了一个非常典型的坑:
Date / LocalDateTime 转换后时间不对,甚至直接报错。

这篇文章就完整复盘一次这个问题:
为什么会错?
错在哪里?
以及在真实项目中,应该怎么写,才能尽量少踩雷。

问题背景:时间看着对,结果却不对

先说一个非常真实的场景。

后端接口返回了一个时间字符串:

2024-12-01 10:30:00

需求很简单:

  • 转成时间对象
  • 存到数据库
  • 后面再做排序、区间查询

代码里有人这样写:

Datedate=newDate("2024-12-01 10:30:00");

或者:

LocalDateTimetime=LocalDateTime.parse("2024-12-01 10:30:00");

结果要么:

  • 直接抛异常
  • 要么时间不对
  • 要么在不同机器、不同时区表现不一致

问题并不在字符串本身,而在于:时间格式不一致 + API 使用方式错误。

问题根因:Date 和 LocalDateTime 本质就不是一类东西

先把话说清楚:

Date 的问题,不只是“老”

java.util.Date有几个致命点:

  • 本身不包含明确的格式概念
  • 构造函数和解析方式非常混乱
  • 强依赖系统默认时区
  • 线程安全问题多

最要命的是这一点:
Date 并不知道你字符串的格式是什么。

newDate("2024-12-01 10:30:00");// 已废弃,不可靠

这段代码能跑,本身就是个历史遗留问题。

LocalDateTime 的问题,是“你以为它会自动懂你”

再看这个:

LocalDateTime.parse("2024-12-01 10:30:00");

这段代码会直接报错,原因很简单:

LocalDateTime.parse()只认识 ISO-8601 格式,比如:

2024-12-01T10:30:00

而不是你日常最常见的:

2024-12-01 10:30:00

它不会猜你的格式。

正确做法:明确告诉系统“你给我的是什么格式”

解决这个问题的关键只有一个:

不要让时间解析“靠猜”

使用 DateTimeFormatter 显式定义格式

这是唯一推荐的做法。

可运行 Demo:字符串 → LocalDateTime

示例代码

importjava.time.LocalDateTime;importjava.time.format.DateTimeFormatter;publicclassTimeDemo{publicstaticvoidmain(String[]args){StringtimeStr="2024-12-01 10:30:00";DateTimeFormatterformatter=DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");LocalDateTimelocalDateTime=LocalDateTime.parse(timeStr,formatter);System.out.println(localDateTime);}}

输出结果

2024-12-01T10:30

注意:
这里输出成T分隔是LocalDateTime 的标准表示方式,并不是格式错了。

再进一步:LocalDateTime 和 Date 如何互转

很多项目还没法一次性去掉Date,那就必须处理互转。

LocalDateTime → Date

importjava.time.LocalDateTime;importjava.time.ZoneId;importjava.util.Date;LocalDateTimelocalDateTime=LocalDateTime.now();Datedate=Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());

Date → LocalDateTime

importjava.time.LocalDateTime;importjava.time.ZoneId;importjava.util.Date;Datedate=newDate();LocalDateTimelocalDateTime=date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();

这里有一个非常关键的点:

时区必须明确指定。

否则你在:

  • 本地
  • 服务器
  • 容器
  • 不同时区部署

结果可能都不一样。

实际项目中的推荐写法

结合真实项目经验,给你几个非常实用的建议。

接口层:统一用字符串

  • 明确格式,比如:yyyy-MM-dd HH:mm:ss
  • 前后端严格约定
  • 不要传时间戳 + 再猜含义

业务层:统一用 LocalDateTime

  • 不用Date
  • 不用Calendar
  • 不混用多种时间类型
privateLocalDateTimecreateTime;privateLocalDateTimeupdateTime;

数据库存储:看场景

  • 如果是业务时间:datetime
  • 如果是日志 / 排序:timestamp

但无论哪种:
Java 侧统一用 LocalDateTime。

为什么推荐 LocalDateTime,而不是 Date

Date 是历史包袱,LocalDateTime 才是现代 Java 的正确姿势。

具体原因:

  • API 清晰,不靠猜
  • 不可变对象,线程安全
  • 配合DateTimeFormatter非常明确
  • 更适合业务时间语义

总结

这类时间问题,本质上都不是“技术难题”,而是规范问题

  • 格式不统一
  • API 用法模糊
  • 对时区不敏感

一旦你做到这三点:

  • 明确格式
  • 明确类型
  • 明确时区

Date / LocalDateTime 的坑,至少能少踩 80%。

如果你现在的项目里还在混用Date、字符串和各种工具类,真的值得花点时间统一一次。
这类“看起来不重要”的问题,往往最容易在关键时刻出事故。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询