如何在PHP中将日期时间转换为ISO 8601格式

142

我如何将时间从2010-12-30 23:21:46转换为ISO 8601日期格式? (-_-;)


1
@Gordon 是的,我得到了约4,530个结果,并且我从@alex那里找到了答案。 - wow
@wow请指出为什么4530个结果都没有回答你的问题。 - Gordon
1
@Gordon,我还在学习如何从头到尾编写代码,但我发现他们教我如何从尾到头编写 :) - wow
@wow 不是的。它们教你如何编写字母表($from, $to)。几乎所有的教程都会告诉你使用 date($format, strtotime($dateString)) 或等效的 DateTime 对象。它们只有在这些函数的输入上有所不同。你只需要去 PHP 手册中找到相应页面,查找输入即可。 - Gordon
3
@Gordon 是的,你说得对。我刚学会了字母,现在是拼写比赛时间了。希望我上的是正确的学校。 - wow
10个回答

284

面向对象

这是推荐的方式。

$datetime = new DateTime('2010-12-30 23:21:46');

echo $datetime->format(DateTime::ATOM); // Updated ISO8601

程序化

适用于较旧版本的PHP,或者如果您更熟悉程序化代码。

echo date(DATE_ISO8601, strtotime('2010-12-30 23:21:46'));

4
如何将输出结果从2010-12-30T23:21:46+1100 转换为 2010-12-30T23:21:46+11:00 - wow
16
echo date('c', ...) 输出带有冒号的日期时间格式。 - Gordon
12
date('c', strtotime('2010-12-30 23:21:46')) 不错 @Gordon :) - wow
14
我想指出使用DATE_ISO8601会产生一个日期字符串,它稍微不同于ISO8601(TZ中缺少冒号,ISO8601期望时间要么全部带上冒号,要么全部不带,而不是混合)- date('c') 生成的是严格符合ISO 8601的日期 - 如果代码期望严格的ISO 8601日期时间格式,则可能会导致难以追踪的错误。 参考:https://en.wikipedia.org/wiki/ISO_8601 - ckm
4
由于某些原因,常量ISO8601与ISO-8601不兼容,请改用DateTime::ATOM,请参阅http://php.net/manual/en/class.datetime.php#datetime.constants.iso8601中的注释。 - Guilherme
显示剩余9条评论

49
自PHP 5以后,您可以使用以下代码: echo date(“c”);生成ISO 8601格式的日期时间。 http://ideone.com/nD7piL 评论注意事项:
根据此处所述,对于时区,这两个表达式都是有效的基本格式: ±[hh]:[mm],±[hh][mm]或±[hh]
但请注意,对于扩展用途,+0X:00是正确的,而+0X00是不正确的。因此最好使用date(“c”)。类似讨论在此处

3
请注意与 DATE_ISO8601 的细微差别;+0X:00+0X00 - Ja͢ck
@Ja͢ck 这个需要投反对票吗?通常来说微小的差异并不是一个好主意。 - rybo111
1
@rybo111 我不认为有理由对这个答案进行负评;从技术上讲,'c'DATE_ISO8601都可以产生有效的ISO8601时间表示。 - Ja͢ck
我在回答中添加了一条注释。 - trante
3
“@Ja͢ck DATE_ISO8601不会生成有效的ISO8601表示形式,但DATE_ATOM可以。” - Captain Obvious
显示剩余4条评论

7

如何从ISO 8601转换为Unix时间戳:

strtotime('2012-01-18T11:45:00+01:00');
// Output : 1326883500

如何将Unix时间戳转换为ISO 8601格式(服务器时区):

date_format(date_timestamp_set(new DateTime(), 1326883500), 'c');
// Output : 2012-01-18T11:45:00+01:00

如何将Unix时间戳转换为ISO 8601(GMT)格式:

date_format(date_create('@'. 1326883500), 'c') . "\n";
// Output : 2012-01-18T10:45:00+00:00

如何将 Unix 时间戳转换为 ISO 8601 格式(自定义时区):

date_format(date_timestamp_set(new DateTime(), 1326883500)->setTimezone(new DateTimeZone('America/New_York')), 'c');
// Output : 2012-01-18T05:45:00-05:00

5

$datetime->format('Y-m-d\TH:i:s.u\Z')应该提供正确的格式,带有"T"分隔符,"Z"时区(请确保首先转换为UTC)和微秒(如果您不打算支持小数秒,请省略.u)。

请参见https://dev59.com/4Wkw5IYBdhLWcg3w9_Mi#9532375以了解为什么应该使用T


5

ISO 8601在PHP中基本上是表示为"Y-m-d\TH:i:sP"

你可以从一个常量中获取这个值:

DateTime::ATOM - 适用于PHP版本低于7.2(已删除)

DateTimeInterface::ATOM - 适用于PHP版本7.2及以上


DateTime::ATOM在PHP 7.2中没有被移除。 - Xiyng
在PHP 7.2中,并未移除DateTime::ATOM - undefined

5

如果您尝试在datetime-local中设置一个值

date("Y-m-d\TH:i",strtotime('2010-12-30 23:21:46'));

//output : 2010-12-30T23:21

在接受的答案的评论中提到了类似的解决方案。 - Sushant Pachipulusu

3
根据PHP官方文档,您可以将其简单地格式化为:
echo $objDateTime->format('c'); // ISO8601 formated datetime
echo $objDateTime->format(DateTime::ISO8601); // Another way to get an ISO8601 formatted string

1
您可以尝试这种方式:

$datetime = new DateTime('2010-12-30 23:21:46');

echo $datetime->format(DATE_ATOM);

1
使用 DATE_ATOMc 已经在几年前发布在本页面上了。 - mickmackusa

0

您也可以通过模态框内的变异来获取时间戳转换,就像这样

class YourModal extends Model
{
    public function getCreatedAtAttribute($date)
    {
        return date(DATE_ISO8601, strtotime($date)); // ISO 8601 Date Format
    }
}

0
试试这个
public static function toISO8601(string $dateString): string { 
    $dateTime = new \DateTime($dateString, new \DateTimeZone('UTC'));
    return $dateTime->format('Y-m-d\\TH:i:s.vp');
}

输出将是:2010-12-30T04:56:00.000Z

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