From ba60a2dcbb0b690582d3e732bd50afb4a043e1d5 Mon Sep 17 00:00:00 2001 From: mrlitong Date: Tue, 14 Oct 2025 02:52:18 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E8=BF=87=E6=9C=9F=E6=97=B6=E9=97=B4=E7=9A=84=E6=97=B6?= =?UTF-8?q?=E5=8C=BA=E8=A7=A3=E6=9E=90=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复 datetime-local 输入框在不同浏览器中时区解析不一致的问题。 ## 问题 - datetime-local 返回无时区信息的字符串 (如: 2025-12-31T23:59) - new Date(string) 在不同浏览器中解析行为不一致 - 部分浏览器错误地将其解释为 UTC,导致时区偏移 ## 解决方案 - 手动解析日期时间字符串的各个部分 - 使用 Date 构造函数明确创建本地时间对象 - 统一转换为 UTC ISO 字符串存储 - 添加日期有效性验证和错误处理 ## 影响范围 - 仅影响自定义过期时间设置功能 - 确保用户设置的时间与存储/显示一致 - 提升跨浏览器兼容性 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../accounts/AccountExpiryEditModal.vue | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/web/admin-spa/src/components/accounts/AccountExpiryEditModal.vue b/web/admin-spa/src/components/accounts/AccountExpiryEditModal.vue index 046c3332..09673fa2 100644 --- a/web/admin-spa/src/components/accounts/AccountExpiryEditModal.vue +++ b/web/admin-spa/src/components/accounts/AccountExpiryEditModal.vue @@ -304,7 +304,25 @@ const selectQuickOption = (value) => { // 更新自定义过期时间 const updateCustomExpiryPreview = () => { if (localForm.customExpireDate) { - localForm.expiresAt = new Date(localForm.customExpireDate).toISOString() + try { + // 手动解析日期时间字符串,确保它被正确解释为本地时间 + const [datePart, timePart] = localForm.customExpireDate.split('T') + const [year, month, day] = datePart.split('-').map(Number) + const [hours, minutes] = timePart.split(':').map(Number) + + // 使用构造函数创建本地时间的 Date 对象,然后转换为 UTC ISO 字符串 + const localDate = new Date(year, month - 1, day, hours, minutes, 0, 0) + + // 验证日期有效性 + if (isNaN(localDate.getTime())) { + console.error('Invalid date:', localForm.customExpireDate) + return + } + + localForm.expiresAt = localDate.toISOString() + } catch (error) { + console.error('Failed to parse custom expire date:', error) + } } }