Skip to content

feat(util): remove date-fns-tz and handle string date with timezone#3746

Open
xinglu01 wants to merge 2 commits intomasterfrom
xl/#TINFR-3611
Open

feat(util): remove date-fns-tz and handle string date with timezone#3746
xinglu01 wants to merge 2 commits intomasterfrom
xl/#TINFR-3611

Conversation

@xinglu01
Copy link
Contributor

@xinglu01 xinglu01 commented Feb 6, 2026

  1. datePicker 示例新增一个时区示例( 不同字符串格式、number )
  2. 移除 date-fns-tz 库
  3. 设置时区时,处理传入字符串

@vercel
Copy link

vercel bot commented Feb 6, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
tethys Ready Ready Preview, Comment Feb 6, 2026 10:52am

@worktile-bot
Copy link

代码审查总结

本次提交移除了 date-fns-tz 依赖,并重构了 TinyDate 类中的字符串日期解析逻辑,以支持多种格式(如中文、ISO、英文等)并处理时区。整体方向正确,但存在一些潜在问题需要改进。

主要问题

  1. 潜在安全问题parseStringDate 方法中的正则表达式可能不够健壮,容易受到恶意输入攻击(如 ReDoS)。建议使用更严格的验证或依赖库。
  2. 性能问题parseStringDate 方法中使用了多个正则表达式匹配和循环,可能影响性能,尤其是在频繁调用时。建议优化匹配逻辑或缓存结果。
  3. 可维护性和可读性parseStringDate 方法较长且复杂,建议拆分为更小的函数以提高可读性。同时,错误处理可以更详细,以帮助调试。
  4. 最佳实践:时区处理依赖于 @date-fns/tz,但代码中未显式处理时区转换错误,可能导致运行时异常。建议添加更健壮的错误处理。

改进建议

  • 使用 date-fnsparse 函数替代部分正则匹配,以提高安全性和可维护性。
  • 考虑添加输入验证,防止无效日期字符串导致异常。
  • 优化 parseStringDate 方法的结构,例如将不同格式的解析拆分为独立函数。
  • 在错误处理中提供更详细的错误信息,便于调试。

总体而言,代码变更功能完整,但需关注安全性和性能优化。

@worktile-bot
Copy link

详细审查结果

代码质量和规范性

  • 代码结构清晰,新增了 DATE_FORMATS 常量,提高了可维护性。
  • 方法重命名(如 extractFromMatch 改为 extractComponentsFromMatch)更符合语义。

潜在安全问题

  • 正则表达式 /(\d{4})年(\d{1,2})月(\d{1,2})日?\s*(?:(\d{1,2})[时:](\d{1,2})分?)?/ 可能存在 ReDoS 风险,建议使用 date-fnsparse 函数替代。
  • 正则表达式 /^\d{4}[-/]\d{1,2}[-/]\d{1,2}(?:[T\s]+\d{1,2}:\d{1,2}(?::\d{1,2})?)?/ 缺少边界检查,可能匹配不完整字符串。

潜在的性能问题

  • parseStringDate 方法中使用了多个正则匹配和循环,可能影响性能,建议优化匹配逻辑或缓存结果。
  • 第 124 行添加了 console.log,在生产环境中可能影响性能,建议移除或使用条件日志。

性能优化建议

  • 考虑将 DATE_FORMATS 中的格式按使用频率排序,优先匹配常见格式。
  • 对于频繁调用的解析,可以缓存解析结果以避免重复计算。

可维护性和可读性

  • parseStringDate 方法较长,建议拆分为更小的函数(如 parseChineseFormatparseISOFormat 等)。
  • 错误消息较简单,建议包含更多上下文(如输入字符串和解析失败的原因)。

最佳实践建议

  • 使用 date-fnsparse 函数替代部分正则匹配,提高安全性和可维护性。
  • 添加输入验证,防止无效日期字符串导致异常。
  • 在错误处理中提供更详细的错误信息,便于调试。

结合上次审查结论

  • 上次审查建议使用 date-fnsparse 函数,本次提交已部分采纳,但正则表达式仍需改进。
  • 上次审查提到 new Date(dateString) 的解析行为不一致,本次提交已添加年份范围检查,但建议优先使用 parseISOparse

改进建议总结

  1. 优化正则表达式,避免 ReDoS 风险。
  2. 移除生产环境中的 console.log
  3. 拆分 parseStringDate 方法,提高可读性。
  4. 增强错误处理,提供更详细的错误信息。
  5. 考虑性能优化,如缓存解析结果。

dateArray: Signal<SafeAny[]> = signal([this.date, this.date1, this.date2, this.date3, this.date4, this.date5]);

onChange(result: Date): void {
console.log('onChange: ', result);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 在生产环境中,console.log 可能影响性能并泄露调试信息。建议移除或使用条件日志(如仅在开发模式下输出)。

@worktile-bot
Copy link

详细审查结果

代码质量和规范性

  • 移除了 date-fns-tz 依赖,简化了项目依赖管理。
  • 新增了 DATE_FORMATS 常量,提高了日期格式的可维护性。
  • 方法重命名(如 extractFromMatch 改为 extractComponentsFromMatch)更符合语义。
  • 新增了时区处理示例组件,展示了功能使用方式。

潜在安全问题

  • 正则表达式 /(\d{4})年(\d{1,2})月(\d{1,2})日?\s*(?:(\d{1,2})[时:](\d{1,2})分?)?/ 可能存在 ReDoS 风险,建议使用 date-fnsparse 函数替代。
  • 正则表达式缺少边界检查,可能匹配不完整字符串(如 '2026-02-06 15:00:00 extra')。

潜在的性能问题

  • parseStringDate 方法中使用了多个正则匹配和循环,可能影响性能,建议优化匹配逻辑或缓存结果。
  • 第 22 行添加了 console.log,在生产环境中可能影响性能并泄露调试信息。

性能优化建议

  • 考虑将 DATE_FORMATS 中的格式按使用频率排序,优先匹配常见格式。
  • 对于频繁调用的解析,可以缓存解析结果以避免重复计算。

可维护性和可读性

  • parseStringDate 方法较长,建议拆分为更小的函数(如 parseChineseFormatparseISOFormat 等)。
  • 错误消息较简单,建议包含更多上下文(如输入字符串和解析失败的原因)。

最佳实践建议

  • 使用 date-fnsparse 函数替代部分正则匹配,提高安全性和可维护性。
  • 添加输入验证,防止无效日期字符串导致异常。
  • 在错误处理中提供更详细的错误信息,便于调试。

结合上次审查结论

  • 上次审查建议使用 date-fnsparse 函数,本次提交已部分采纳,但正则表达式仍需改进。
  • 上次审查提到 new Date(dateString) 的解析行为不一致,本次提交已添加年份范围检查,但建议优先使用 parseISOparse

改进建议总结

  1. 优化正则表达式,避免 ReDoS 风险。
  2. 移除生产环境中的 console.log
  3. 拆分 parseStringDate 方法,提高可读性。
  4. 增强错误处理,提供更详细的错误信息。
  5. 考虑性能优化,如缓存解析结果。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants