PHP:将毫秒转换为日期

64

我有一个字符串,表示自Unix纪元以来的毫秒数,代表着一个日期。

我想将它输出为d-m-Y的格式。

我拿到的字符串是"1227643821310",并且被告知结果应该等于2-12-2008,但我一直得到一个25-11-2008的结果。

我的代码如下:

$mil = 1227643821310;
$seconds = $mil / 1000;
echo date("d-m-Y", $seconds);
任何想法为什么会这样?
6个回答

61
您已经做得很正确了,1227643821不是02-12-2008,而是确实25-11-2008。

1
您说得确实没错 - 结果证明我得到的源代码是错误的。 - Jeff Winkworth
5
有没有理由不直接将代码简化为一步完成呢?总是寻找方法来节省内存、减少不必要的内存/变量/行。echo date("d-m-Y", ($mil / 1000) ); - Wes
这是另一个我经常使用的在线Unix纪元时间戳转换器:https://www.epochconverter.com/ - Dan

33

我只是像下面的例子一样添加了H:i:s:

$mil = 1227643821310;
$seconds = $mil / 1000;
echo date("d/m/Y H:i:s", $seconds);

6
$mil = 1227643821310;
$seconds = ceil($mil / 1000);
echo date("d-m-Y", $seconds);

2

Jeff,在处理时间戳时需要理解的重要事情是:它们表示从 1970 年 01 月 01 日 0:00:00 GMT 开始经过的时间,而不是你所在时区的时间(当然,除非你自己在 GMT 时区)。

1227643821 确实代表了 GMT 时间 2008 年 11 月 25 日 20:10:21。

这是世界上大多数地区的 2008 年 11 月 25 日,但在莫斯科以东的时区(以及夏令时期间的莫斯科时区本身),已经是 11 月 26 日了。由于最“极端”的东部时区是 GMT+14,因此在世界上没有任何地方,1227643821 时间戳可以代表晚于 26 日的日期。

原始值的作者可能在处理时区时出现了误解。或者只是简单地出现了错误。例如,在计算值时,在某个步骤中添加了秒而不是毫秒。


1
Ilya,Unix时间戳(POSTIX时间)是自GMT时代以来经过的时间量,这是真的。但是,当您使用PHP的date()函数时,它会将该日期转换为服务器本地时间等效值。为了获得GMT时间的日期,您必须使用PHP的gmdate()函数。 - user641378

1
我能想到的唯一方法就是在将其转换为日期之前尝试四舍五入小数部分。如果这不改变结果,那么结果就是正确的。

0

对于转换本身,我使用以下代码:$date = date('d-m-Y H:i:s', $millis / 1000);

虽然答案很简单,但我还是喜欢发布一个示例片段以供使用,所以这里有它。

从中提取

// explode values first in spaces and then in dashes
$date = explode('-', explode(' ', $date)[0]); 
$day = $date[0];
$month = $date[1];
$year = $date[2];

随意使用它们:echo $day . '-' . $month . '-' . $year;

输出:dd-mm-yyyy


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接