PHP:获取特定时间的 DateTimeImmutable 对象的最佳方法

And*_*eKR 3 php datetime

所以,我有一些时间值:

$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)

Sky*_*lit 7

你可以尝试这样的事情:

$time = (new DateTimeImmutable)
    ->setTime($hour, $minute, $second)
    ->setDate($year, $month, $day);
Run Code Online (Sandbox Code Playgroud)

这是第一个示例代码的“更短”变体


Luc*_*one 5

您可以使用mktimeDateTimeImmutable::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)