PHP strftime处理午夜时间问题:如何强制识别为新日期?
解决PHP strftime解析UTC时间戳日期不符的问题
我之前也踩过类似的坑!问题根源其实出在strftime依赖PHP的默认时区设置上——你手里的时间戳1519516800对应UTC时区的2018-02-25 00:00,但如果你的PHP默认时区不是UTC,这个时间戳在本地时区可能会被解析成前一天(比如美国东部时区是UTC-5,UTC的0点就对应当地前一天的19点,这时候strftime就会返回24日)。
下面给你两个靠谱的解决办法:
方法一:临时切换时区(适配strftime)
strftime会用当前PHP的默认时区解析时间戳,所以我们可以临时把时区切到UTC,格式化完成后再切回去,避免影响其他业务逻辑:
// 先保存原有时区,防止污染全局设置 $oldTimezone = date_default_timezone_get(); // 切换到UTC时区 date_default_timezone_set('UTC'); $targetTimestamp = 1519516800; // 用strftime格式化,比如获取完整日期 echo strftime('%Y-%m-%d', $targetTimestamp); // 输出2018-02-25 // 恢复原有时区 date_default_timezone_set($oldTimezone);
方法二:用DateTime类(更推荐,无全局副作用)
DateTime类的时区处理更灵活,不需要修改全局设置,直接针对目标时间做精准处理:
// 直接用ISO字符串初始化DateTime,自动识别UTC时区 $date = new DateTime('2018-02-25T00:00:00+00:00'); // 直接格式化出日期,完全不受全局时区影响 echo $date->format('Y-m-d'); // 输出2018-02-25 // 如果一定要用strftime,也可以转成UTC时间戳后处理 $utcTimestamp = $date->getTimestamp(); date_default_timezone_set('UTC'); echo strftime('%d', $utcTimestamp); // 输出25 date_default_timezone_set(date_default_timezone_get()); // 恢复时区
额外提醒
strftime还会受系统的LC_TIME区域设置影响,如果上面的方法仍不生效,可以检查下系统区域设置是否正确(比如是否为en_US.UTF-8这类支持标准日期格式的区域)。
内容的提问来源于stack exchange,提问作者toni
相关产品推荐
相关产品推荐

