某些月份和日期的date_create_from_format php不会返回正确的日期

时间:2014-07-31 13:54:59

标签: php date datetime

我在php中有一个函数,它使用date_create_from_format函数将格式为'Ym'的日期转换为datetime。它正常工作,除了我今天发现的一个案例,我无法找到问题。情况如下:

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

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

$newDateCreated = date_create_from_format('Ym', $period);

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

如果不是设置值201409,而是将201411或201408设置为正确创建新的日期时间。

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

$newDateCreated = date_create_from_format('Ym', $period);

$newDateCreated = date_create_from_format('Ymd', $period.'01');

我认为这必须与月份的某些事情有关,但我无法找到真正的问题。有关于此的任何想法吗?

提前致谢。

1 个答案:

答案 0 :(得分:3)

来自manual

  

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

     

如果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"
// }