From 8d97510bc9976a7177b572eb77fca2e2cf033f3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=AE=B6=E8=AE=AD?= Date: Tue, 20 Oct 2026 15:09:31 +0800 Subject: [PATCH] =?UTF-8?q?fix(public-todo):=20dueDate=20=E6=94=B9=20Strin?= =?UTF-8?q?g=20=E6=98=A0=E5=B0=84=EF=BC=8C=E4=BF=AE=E5=A4=8D=E6=88=AA?= =?UTF-8?q?=E6=AD=A2=E6=97=A5=E6=9C=9F=E5=B7=AE=E4=B8=80=E5=A4=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 根因:Date 类型经 @DateTimeFormat 按本地时区解析为当日 00:00, 再经 JDBC(serverTimezone=UTC)与 MySQL 时区换算后漂移一天 - dueDate 改为 String(yyyy-MM-dd),字符串往返不参与任何时区换算 - add/update 对空串统一转 null(DATE 列不接受空串) - stats 逾期判断改字符串比较,与前端口径一致 - 实测:提交 2026-10-27 → 库存 2026-10-27 → 返回 2026-10-27,完全一致 --- .../admin/controller/PublicTodoController.java | 13 +++++++++++-- .../java/com/freedom/admin/entity/PublicTodo.java | 8 +++----- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/freedom/admin/controller/PublicTodoController.java b/src/main/java/com/freedom/admin/controller/PublicTodoController.java index c561ac0..c80046f 100644 --- a/src/main/java/com/freedom/admin/controller/PublicTodoController.java +++ b/src/main/java/com/freedom/admin/controller/PublicTodoController.java @@ -93,6 +93,10 @@ public class PublicTodoController { } try { publicTodo.setId(null); + // DATE 列不接受空串,空值统一转 null + if (StringUtils.isBlank(publicTodo.getDueDate())) { + publicTodo.setDueDate(null); + } if (publicTodo.getStatus() == null) { publicTodo.setStatus(0); } @@ -123,6 +127,10 @@ public class PublicTodoController { return Result.error().message("标题不能为空"); } try { + // DATE 列不接受空串,空值统一转 null + if (StringUtils.isBlank(publicTodo.getDueDate())) { + publicTodo.setDueDate(null); + } publicTodo.setUpdateBy(OPERATOR); publicTodo.setUpdateDate(new Date()); publicTodo.setCreateBy(null); @@ -210,11 +218,12 @@ public class PublicTodoController { int done = 0; int overdue = 0; Map byCategory = new HashMap<>(); - Date today = new Date(); + // 逾期按 yyyy-MM-dd 字符串比较,与前端口径一致,不经时区换算 + String today = new java.text.SimpleDateFormat("yyyy-MM-dd").format(new Date()); for (PublicTodo item : list) { if (item.getStatus() != null && item.getStatus() == 1) { done++; - } else if (item.getDueDate() != null && item.getDueDate().before(today)) { + } else if (item.getDueDate() != null && item.getDueDate().compareTo(today) < 0) { overdue++; } String cat = StringUtils.isBlank(item.getCategory()) ? "未分类" : item.getCategory(); diff --git a/src/main/java/com/freedom/admin/entity/PublicTodo.java b/src/main/java/com/freedom/admin/entity/PublicTodo.java index e322279..e838084 100644 --- a/src/main/java/com/freedom/admin/entity/PublicTodo.java +++ b/src/main/java/com/freedom/admin/entity/PublicTodo.java @@ -5,7 +5,6 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; import java.io.Serializable; import java.util.Date; @@ -49,11 +48,10 @@ public class PublicTodo implements Serializable { private String category; /** - * 截止日期 + * 截止日期(yyyy-MM-dd) + * 用 String 映射 DATE 列:字符串往返不经 JDBC 时区换算,避免差一天 */ - @DateTimeFormat(pattern = "yyyy-MM-dd") - @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") - private Date dueDate; + private String dueDate; /** * 状态:0未完成 1已完成