Famousmai's blog Famousmai's blog
首页
👍 网站介绍
💯 编程分享
✍️ 生活感悟
🎮 游戏人生
📈 网站动态
💌 收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Famous Mai

爱玩辅助的后端小哥
首页
👍 网站介绍
💯 编程分享
✍️ 生活感悟
🎮 游戏人生
📈 网站动态
💌 收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 算法

  • 学习笔记

  • 踩坑记录

    • PHP踩坑记录
      • 1. 定位Bug - 投票功能 strtotime('+1 month') 时间计算错误
        • 1.1 发现bug,定位相关代码
        • 1.2 找出问题所在
        • 1.3 修复BUG
        • 1.4 总结
    • Node踩坑记录
    • Mac系统踩坑记录
    • go-vue-admin踩坑记录
  • 面试分享

  • 技术方案文章梳理

  • 设计模式

  • 编程分享
  • 踩坑记录
famousmai
2023-02-17
目录

PHP踩坑记录

# PHP

# 1. 定位Bug - 投票功能 strtotime('+1 month') 时间计算错误

发布时间:Mar 17, 2019 by FamousMai

# 1.1 发现bug,定位相关代码

中午一觉醒来,群里说投票功能的结束时间出错了,整整多出了30天左右

为啥之前沒出现这种问题,到了今天才出现了,看了看代码

/*
 * 获取本期投票功能结束时间,即下一期开始时间
 */
function getPollEndTime(){
    // 本月5号
    $month_fifth = strtotime(date("Y-m-05 12:00:00"));
    // 下个月5号
    $next_month_fifth = strtotime(date("Y-m-05 12:00:00",strtotime('+1 month')));
    $now_time = time();


    // 若本月5号已经过去,则结束时间为下月5号
    if ($now_time >= $month_fifth) {
        return $next_month_fifth;
    }
    // 若本月5号还未过去,则结束时间为本月5号
    if ($now_time < $month_fifth) {
        return $month_fifth;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 1.2 找出问题所在

乍一看,没啥毛病啊,于是断点调试一下了获取结束时间函数,发现了原来算到到下下个月的5号去了,实际上9月5号为结束时间,变成了10月5号为结束时间,所以才多出了那30多天。

思考问题原因

问题找到了,可为什么到了今天才计算出錯呢,看了看今天的日期8月31号,月末,猜想会不会 strtotime('+1 month') 这种计算方式有问题呢

百度了一下,果然是这样

文档参考:strotime 计算上月下月問題 (opens new window)

# 1.3 修复BUG

date("Y-m-05 12:00:00",strtotime('+1 month'))
1

改为

date ("Y-m-05 H:i:s", mktime(12, 0, 0, date("m") + 1, 1, date("Y")))
1

测试:时间正常,bug修复

# 1.4 总结

原先的改法确实比較复杂,可以这样来改,但是不知道怎么解释才好

// 下個月五號
$next_month_fifth = strtotime(date("Y-m-05 12:00:00", strtotime('+1 month')));
1
2

改成 =>

// 本月五號
$month_fifth = strtotime(date("Y-m-05 12:00:00"));
// 下個月五號
$next_month_fifth = strtotime(date('Y-m-05 12:00:00' , strtotime('+1 month' , $month_fifth)));
1
2
3
4

总结

要使用 strotime 来计算跨月的时间,还是要慎用,strotime 函数跨月本身计算会有问题

编辑 (opens new window)
#PHP
上次更新: 2023/02/19, 00:03:59
Paypal对接学习笔记
Node踩坑记录

← Paypal对接学习笔记 Node踩坑记录→

最近更新
01
策略模式
03-13
02
单例模式
03-05
03
设计模式介绍
03-05
更多文章>
Theme by Vdoing | Copyright © 2022-2023 Evan Xu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式