PHP - 如何将日期格式化为 ISO8601 格式?

11

我有一个年份(2002),我想将它转换为以下格式:

2002-00-00T00:00:00

我尝试了多个迭代,最后一个是这个:

$testdate = DateTime::createFromFormat(DateTime::ISO8601, date("c"))
echo date_format($testdate, '2002'); 

但是,即使我接近正确的时间,它似乎总是在结尾添加 +00:00 …

4个回答

17

在PHP中,'c'格式总是附加时区偏移量。你无法避免这一点。但你可以从组件构建日期:

date('Y-m-d\TH:i:s', $testdate);

我总是把事情搞得比必要的更复杂...谢谢! - KumbaThought
1
哦!我已经寻找这个很长一段时间了。我弄清楚了“c”部分,但是不知道我必须转义T。我一直得到T的时区。哎呀!谢谢。 - Mike S.
5
gmdate('Y-m-d\TH:i:s\Z',$date) - 4esn0k

6

DATE_ISO8601 also adds the +00:00 timezone bit OP is trying to avoid.Example: echo date(DATE_ISO8601, 1612308970); // prints "2021-02-02T23:36:10+0000" - kaldimar
创建新的常量并像链接中的示例一样使用它,因为这样可以重复使用且易于阅读。定义("DATE_ISO8601_WITHOUT_TIME", "Y-m-d\TH:i:s"); 在 $timeToChange 上使用 date(DATE_ISO8601_WITHOUT_TIME); - fearis

3
date('Y-m-d\TH:i:s\Z', time() - date('Z'));

5
更好地解释需要更加详细地阐述。 - Rumit Patel
1
感谢您提供这段代码片段,它可能会在短期内提供一些有限的帮助。通过展示为什么这是一个好的解决方案,适当的解释将极大地提高其长期价值,并使其对未来具有类似问题的读者更有用。请编辑您的答案以添加一些解释,包括您所做的假设。 - Toby Speight

3

在IT技术中,有时候会遇到毫秒和最后几微秒的问题,这些毫秒和微秒通常是以4或8结尾的。将日期转换为ISO 8601格式可以通过以下方法之一实现:"date(DATE_ISO8601)",我曾经使用过这种解决方案。

// In this form it leaves the date as it is without taking the current date as a reference
$dt = new DateTime();
echo $dt->format('Y-m-d\TH:i:s.').substr($dt->format('u'),0,3).'Z';
// return-> 2020-05-14T13:35:55.191Z

// In this form it takes the reference of the current date
echo date('Y-m-d\TH:i:s'.substr((string)microtime(), 1, 4).'\Z');
return-> 2020-05-14T13:35:55.191Z

// Various examples:
$date_in = '2020-05-25 22:12 03.056';
$dt = new DateTime($date_in);
echo $dt->format('Y-m-d\TH:i:s.').substr($dt->format('u'),0,3).'Z';
// return-> 2020-05-25T22:12:03.056Z

//In this form it takes the reference of the current date
echo date('Y-m-d\TH:i:s'.substr((string)microtime(), 1, 4).'\Z',strtotime($date_in));
// return-> 2020-05-25T14:22:05.188Z

之前发布的:https://dev59.com/sHNA5IYBdhLWcg3wk--A#61796705


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