所以,我有一些时间值:
$year = 2017; $month = 2; $day = 16; $hour = 7; $minute = 24; $second = 10;
Run Code Online (Sandbox Code Playgroud)
PHP 是否有一种自然的方式从中获取 DateTimeImmutable 对象?
是这个吗?
$datetime = new DateTime; // Create DateTime for current time
$datetime->setDate($year, $month, $day);
$datetime->setTime($hour, $minute, $second);
$datetime = DateTimeImmutable::createFromMutable($datetime);
Run Code Online (Sandbox Code Playgroud)
构造函数只接受一个字符串。该手册描述了几种格式,但它们都不是 ISO 日期或类似的格式。我是否应该任意选择一个,例如“WDDX”(因为它不需要我填充值),并相应地格式化我的日期?
$datetime = DateTimeImmutable($year.'-'.$month.'-'.$day.'T'.$hour.':'.$minute.':'.$second$);
Run Code Online (Sandbox Code Playgroud)
这些方式都感觉比较麻烦。这通常是如何完成的?
编辑:我刚刚找到了另一种感觉很正确的方法(文档并没有那么容易):
$datetime = DateTimeImmutable::createFromFormat(DateTimeImmutable::ATOM, $year.'-'.$month.'-'.$day.'T'.$hour.':'.$minute.':'.$second.'+00:00');
Run Code Online (Sandbox Code Playgroud)
你可以尝试这样的事情:
$time = (new DateTimeImmutable)
->setTime($hour, $minute, $second)
->setDate($year, $month, $day);
Run Code Online (Sandbox Code Playgroud)
这是第一个示例代码的“更短”变体
您可以使用mktime和DateTimeImmutable::setTimestamp
$year = 2017; $month = 2; $day = 16; $hour = 7; $minute = 24; $second = 10;
$datetime = (new DateTimeImmutable())
->setTimestamp(
mktime($hour, $minute,$second, $month, $day, $year)
);
var_dump($datetime);
Run Code Online (Sandbox Code Playgroud)
只是一个明显的注释:
请记住,DateTimeImmutable 对象是不可变的:),因此每个方法setSomething都会返回 DateTimeImmutable 的新实例,并且不会更改初始实例。
所以
$timestamp = 12345;
$datetime = new DateTimeImmutable();
$datetime->setTimestamp($timestamp); // wrong
$datetime = $datetime->setTimestamp($timestamp); // right
// or better
$datetime = (new DateTimeImmutable())->setTimestamp($timestamp);
Run Code Online (Sandbox Code Playgroud)