date_create_from_format php在特定月份和日期不返回正确的日期

col*_*igo 2 php datetime date

我在 php 中有一个函数,它使用 date_create_from_format 函数将格式“Ym”的日期转换为日期时间。它工作正常,除了我今天发现的一种情况,但我找不到问题。情况如下:

当前日期:2014 年 7 月 31 日。

$period值:'201409'(作为我想做一些计算的月份)

$newDateCreated = date_create_from_format('Ym', $period);
Run Code Online (Sandbox Code Playgroud)

这将返回创建的新日期时间,但其值为 10/01/2014 而不是 09/01/2014

如果我不设置值 201409,而是设置 201411 或 201408,则可以正确创建新日期时间。

我发现的唯一解决方案是替换

$newDateCreated = date_create_from_format('Ym', $period);
Run Code Online (Sandbox Code Playgroud)

为了

$newDateCreated = date_create_from_format('Ymd', $period.'01');
Run Code Online (Sandbox Code Playgroud)

我相信这一定与该月的某一天有关,但我找不到真正的问题。对此有什么想法吗?

提前致谢。

Pet*_*Wal 5

手册来看:

如果格式不包含字符!那么生成的时间中未指定格式的部分将被设置为当前系统时间。

如果 format 包含字符 !,则 format 中未提供的生成时间部分以及 ! 左侧的值将被设置为 Unix 纪元中的相应值。

Unix 纪元是 1970-01-01 00:00:00 UTC。

例子

date_create_from_format('Ym', '201409');

// Tries '2014-09-31 15:59:45', but since that date doesn't exists 
// that becomes '2014-10-01':
// object(DateTime)#62 (3) {
//  ["date"] => string(19) "2014-10-01 15:59:45"
//  ["timezone_type"] => int(3)
//  ["timezone"] => string(16) "Europe/Amsterdam"
// }

date_create_from_format('!Ym', '201409');

// object(DateTime)#62 (3) {
//  ["date"] => string(19) "2014-09-01 00:00:00"
//  ["timezone_type"] => int(3)
//  ["timezone"] => string(16) "Europe/Amsterdam"
// }
Run Code Online (Sandbox Code Playgroud)