将UNIX时间戳转换为格式化日期字符串

238
使用PHP,我想将UNIX时间戳转换为类似于2008-07-17T09:24:17Z的日期字符串。如何将时间戳1333699439转换为2008-07-17T09:24:17Z
10个回答

396

试试这样使用gmdate

<?php
$timestamp=1333699439;
echo gmdate("Y-m-d\TH:i:s\Z", $timestamp);
?>

80
请注意,gmdate() 返回的是格林威治标准时间下的日期/时间。date() 则会返回本地日期/时间。 - Matt K
11
在这个上下文中,上述评论没有意义。根据答案所示,使用第二参数为时间戳的日期将不会在本地时区打印日期。日期将被打印为忽略时区信息,因为时间戳没有时区信息。gmdate和第二个时间戳参数为1333699439的日期将打印相同的日期和时间。 - Tinus Tate
2
@MattK:这是有道理的,因为Z表示UTC。Tinus:Unix时间戳不包含时区偏移。 dategmdate的输出将根据TZ变量而异(至少在*nix上)。 - Gert van den Berg
如果这个答案包括将格式化日期转换为UNIX时间的解决方案,那就更好了。 - Olle Härstedt
1
@KasparL.Palgi 你需要将时间戳除以1000才能得到正确的年份,因为这个时间戳是以毫秒为单位存储的。 - Wadih M.
显示剩余3条评论

144

使用日期函数 date ( string $format [, int $timestamp = time() ] )

使用date('c',time())作为格式将其转换为ISO 8601日期(在PHP 5中添加)- 2012-04-06T12:45:47+05:30

使用date("Y-m-d\TH:i:s\Z",1333699439)获取2012-04-06T13:33:59Z

以下是日期函数支持的一些格式

<?php
$today = date("F j, Y, g:i a");                 // March 10, 2001, 5:16 pm
$today = date("m.d.y");                         // 03.10.01
$today = date("j, n, Y");                       // 10, 3, 2001
$today = date("Ymd");                           // 20010310
$today = date('h-i-s, j-m-y, it is w Day');     // 05-16-18, 10-03-01, 1631 1618 6 Satpm01
$today = date('\i\t \i\s \t\h\e jS \d\a\y.');   // it is the 10th day.
$today = date("D M j G:i:s T Y");               // Sat Mar 10 17:16:18 MST 2001
$today = date('H:m:s \m \i\s\ \m\o\n\t\h');     // 17:03:18 m is month
$today = date("H:i:s");                         // 17:16:18
?>

1
如何使用'C'将特定的时间戳转换?例如,1333699439 - Utku Dalmaz
这行代码不起作用:date("Y-m-d\TH:i:s\Z",1333699439),输出结果是2012-04-06EDT04:03:59-14400。 - Utku Dalmaz
@Ahmet - 定义字符串时请注意使用双引号和单引号。 - Mark Baker
感谢您提供详细的答案。只有一个问题:date("Y-m-d\TH:i:s\Z",1333699439) 用于获取2012-04-06T13:33:59Z --- 那个 T 和 Z 是什么?我猜 T 是时间,Z 是什么?再次感谢。 - user2060451
1
@user2060451,任何以反斜杠开头的内容都会在生成的时间字符串中显示为字面字符。 - verbumSapienti
1
@user2060451:Z 应该表示 UTC 时间(这种情况下应使用 gmdate...)请查看您喜爱的研究资源上的 ISO8601 信息。 - Gert van den Berg

74

假设你使用的是PHP5.3,那么处理日期的现代方式是使用本地DateTime类。要获取当前时间,只需调用:

$currentTime = new DateTime();
从特定的时间戳(而不是当前时间)创建一个DateTime对象
$currentTime = DateTime::createFromFormat( 'U', $timestamp );

要获得格式化的字符串,您可以调用以下方法:

$formattedString = $currentTime->format( 'c' );

点击这里查看手册页面


2
我该如何使用这个程序将特定的时间戳转换为日期时间格式?例如,1333699439。 - Utku Dalmaz
1
@Norse 当然我读了他的帖子。他需要的所有信息都在我的帖子中。他所要做的就是阅读PHP文档中关于DateTime对象的部分。我已经编辑了我的帖子,使其更加清晰明了。在PHP中,DateTime对象是最好的选择,所有新手都应该被鼓励使用它。到目前为止,我是唯一提供这个答案的人。顺便说一句,我认为你的评论有点过于激烈,不太符合SO的精神。 - liquorvicar
1
@Ahmetvardar 请看我的编辑,虽然所有这些都在我提供链接的PHP文档中。我强烈建议您开始使用DateTime对象。它为日期/时间提供了出色的支持,包括时区等。 - liquorvicar

27

设置默认时区非常重要,以获得正确的结果。

<?php
// set default timezone
date_default_timezone_set('Europe/Berlin');

// timestamp
$timestamp = 1307595105;

// output
echo date('d M Y H:i:s Z',$timestamp);
echo date('c',$timestamp);
?> 

在线转换帮助:http://freeonlinetools24.com/timestamp


2
在ISO8601中,“Z”用于表示它是UTC时间,因此时区应设置为“UTC”。 - Gert van den Berg

25
<?php
$timestamp=1486830234542;
echo date('Y-m-d H:i:s', $timestamp/1000);
?>

6
没有除法部分的话,程序会默认日期为1970年。 - Script47
这对我有效。不知道为什么其他人说它不起作用。可能是因为我使用的是PHP7.2? - Lapiz the Programmer
@LapiztheProgrammer 是的,它取决于 PHP 版本。 - sunil
2
我正在从外部 API 获取值,它看起来像这样:'1623923723000'。在这种情况下,除法部分是必要的,以获得正确的日期:'2021-06-17 11:55:23'。 感谢分享解决方案。 - WojCup
数值必须以毫秒为单位。日期必须假定为以秒为单位的Unix时间戳。 - Tom
为了使结果正确,需要添加date_default_timezone_set("Asia/Tehran"); - Ali

9
类的构造函数可以接收一个字符串。如果在时间戳前面加上@字符,就可以创建一个带有该时间戳的对象。格式化时使用“c”格式,这是一种预定义的ISO 8601复合格式。
如果需要,可以像下面这样使用类...设置正确的时区或留空以获取UTC时间。
$dt = new DateTime('@1333699439');
$dt->setTimezone(new DateTimeZone('America/New_York'));
echo $dt->format('c');

7
$unixtime_to_date = date('jS F Y h:i:s A (T)', $unixtime);

这也应该可以工作。

6

您可以像这样做......

$originalDate = "1585876500";

echo $newDate = date("Y-m-d h:i:sa", date($originalDate));

4

大多数人不会阅读评论,而且在被接受的答案中存在gmdate()的问题,它返回的是GMT时间,因此如果我们使用date_default_timezone_set(zone)就行不通了,应该使用date()

<?php

$ts = 1664706166;
$date = date('Y-m-d H:i:s', $ts);
$gmdate = gmdate('Y-m-d H:i:s', $ts);
echo  "date()  : $date\n";
echo  "gmdate(): $gmdate\n\n";

date_default_timezone_set("Asia/Jakarta");
$date = date('Y-m-d H:i:s', $ts);
$gmdate = gmdate('Y-m-d H:i:s', $ts);
echo  "date()  : $date\n";
echo  "gmdate(): $gmdate <- GMT\n";

/* result
date()  : 2022-10-02 10:22:46
gmdate(): 2022-10-02 10:22:46

After set timezone
date()  : 2022-10-02 17:22:46
gmdate(): 2022-10-02 10:22:46 <- GMT
*/

1

我在这次交谈中找到的信息非常有帮助,我想补充一下,是通过使用我的MySQL数据库中的时间戳和一点PHP来解决问题的。

 <?= date("Y-m-d\TH:i:s\+01:00",strtotime($column['loggedin'])) ?>

输出结果为:2017-03-03T08:22:36+01:00
非常感谢Stewe,你的回答对我来说是一个重大发现。

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