如何判断UTC时区时间已重置 实现投票系统每日单次投票限制
现有代码问题分析
- 核心判断逻辑颠倒:
$reset < $lastDate的含义是「上次投票时间在今日UTC 0点之后」,说明用户当前自然周期已经投过票,此时$canvote应该为false,原代码的赋值逻辑完全相反 - 存在冗余的时间转换操作:
$lasttime本身是Unix时间戳的前提下,不需要先格式化为datetime字符串再转回时间戳,多余操作既损耗性能也存在潜在的格式异常风险 - 缺少无历史投票记录的处理分支:如果是用户第一次投票,没有存储的
$lasttime记录,原逻辑没有对应适配场景
正确实现代码
date_default_timezone_set("UTC"); // 取当前UTC日期的0点重置时间戳 $todayReset = strtotime('today 00:00:00'); if (empty($lasttime)) { // 无历史投票记录,直接允许投票 $canVote = true; } else { // 上次投票时间早于今日重置时间,说明属于上一个周期的投票,当前周期可投 $canVote = $lasttime < $todayReset; }
场景校验说明
- 用户上次投票时间为UTC 2024-05-20 23:00:00,对应时间戳小于2024-05-21 00:00:00的重置时间,到5月21日0点后
$canVote自动变为true,允许立即投票 - 用户2024-05-21 08:00完成投票后,
$lasttime大于当日重置时间,$canVote变为false,直到5月22日0点重置前都无法投票,完全符合按自然日周期重置的需求,无需等投票时间满24小时
额外注意点
建议数据库直接存储Unix时间戳格式的投票时间,避免存储datetime字符串时出现时区转换错误,进一步降低逻辑异常概率。
内容的提问来源于stack exchange,提问作者Arya
相关产品推荐
相关产品推荐

