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 年月日转换关闭的主要内容,如果未能解决你的问题,请参考以下文章

php 中将完整的年月日时分秒的时间转换成 年月日的形式

时间戳转换年月日

PHP strtotime() 函数

php怎么获取今天零点的时间戳

php生成唯一订单号 时间戳可以吗

[PHP]将秒转换为时间(年月日小时)