Unix 时间戳到 PHP 年月日转换关闭
Posted
技术标签:
【中文标题】Unix 时间戳到 PHP 年月日转换关闭【英文标题】:Unix Timestamp to PHP Year Month and Day Conversion Off 【发布时间】:2016-06-16 04:49:47 【问题描述】:我们正在将我们的域转移到我们最近购买的新的专用服务器上。新服务器的时区导致我们的附件 php 代码出现一些问题。
我们的论坛软件使用以下文件夹结构来存储附件:
/public_html/forum/files/2016/February/14/[文件名]
年月日是从文件上传时间戳中获取的,文件上传时间戳是一个 Unix 时间戳,例如“1455426488”。然后使用以下 php 代码将此时间戳转换为年、月和日:
$date = getdate((int)$attachment['filetime']);
$filepath = $config['upload_path'] . '/' . (string)$date['year'] . '/' . $date['month'] . '/' . (string)$date['mday'];
这在我们的旧服务器和之前的服务器上运行良好,但在新服务器上,转换后“天”要么晚 1 天,要么提前1天,这导致“2 月 14 日”文件上传最终在“2 月 13 日”文件夹或“2 月 15 日”。请记住,unix 时间戳中 1455426488 的文件上传时间是 2016 年 2 月 14 日凌晨 5:08 UTC 时区。
有人对如何解决此问题有任何建议吗?这是我们论坛系统的重要组成部分,因此如果不提出解决方案,我们将无法迁移到新服务器。
谢谢,
皮特
顺便说一句,旧服务器和新服务器都使用“美国/芝加哥”作为他们的时区 (CST)。
【问题讨论】:
你可以试试$date = (int)$attachment['filetime']; $filepath = $config['upload_path']."/".date("Y",$date)."/".date("F",$date)."/".date("d",$date);
PHP 是什么时区(美国/芝加哥?)服务器/操作系统是什么时区(日期 +%Z)?
@user2182349 - PHP 时区是“美国/芝加哥”,服务器/操作系统时区是“CST”。
@user2352577L - 您的建议没有解决问题。该脚本仍然无法找到正确的文件。
尝试添加 date_default_timezone_set('America/Chicago');在您的 php 函数顶部,日期时间转换为 unix 时间戳。看看这是否有效。
【参考方案1】:
您可以使用 DateTime 类来转换您的日期。
$date = new DateTime(null, new DateTimeZone('America/Chicago'));
$date->setTimeStamp((int)$attachment['filetime']);
$filepath = $config['upload_path'] . '/' . $date->format('Y') . '/' . $date->format('F') . '/' . $date->format('d');
【讨论】:
虽然您的建议确实减少了错误范围,但并没有完全消除所有错误。对于大约一半的文件,您的建议有效,而对于另一半则无效。 如果你所有的(int)$attachment['filetime']
都是UTC,它应该可以工作。所以我的问题是,你确定你所有的上传时间都在同一个时区吗?
我很确定所有文件时间都是 UTC,因为这个确切的设置在以前的论坛上工作。
您能否提供一个有问题的案例:上传时间、您期望的路径、您获得的错误路径
这是一个示例:文件上传时间:1455426488,UTC 日期和时间:02/14/2016 @ 5:08am (UTC)。该文件预计将显示在 14 文件夹中,但它实际上显示在 13 文件夹中。所以基本上我得到/2016/February/14,但实际上该文件位于/2016/February/13。当然我还有其他的有相反的问题。【参考方案2】:
我发现了问题!看起来下面这行已经进入了 download/file.php 文件:
date_default_timezone_set('GMT');
该行在原始文件中不存在,因此删除它解决了问题!我仍然不确定这条线是如何添加的,但它解释了奇怪的行为。
谢谢, 皮特
【讨论】:
date_default_timezone_set('GMT');
更改了 php 的时区,这使您在执行每种 php 日期时间格式后都会得到错误的时间。以上是关于Unix 时间戳到 PHP 年月日转换关闭的主要内容,如果未能解决你的问题,请参考以下文章