PHP的DateTime::createFromFormat忽略闰年

5

我需要将一年中的第几天(DayOfYear)转换为日期(Date)。

对于2016年的第70天,我尝试使用以下方法:

php -r 'var_dump(DateTime::createFromFormat("z Y","69 2016"));'
class DateTime#1 (3) {
  public $date =>
  string(26) "2016-03-11 14:21:07.000000"
  public $timezone_type =>
  int(3)
  public $timezone =>
  string(3) "UTC"
}

('z'是从0开始的)

但是这是错误的。应该是2016-03-10!

这是PHP的一个Bug吗?


3
自5.3.9版本以来,似乎存在一个已知的错误:https://bugs.php.net/bug.php?id=62476 - Aioros
3
有个错误。反向格式是可行的:::createFromFormat("Y z", "2016 69") - fusion3k
1
今天在2020年面临了这个问题:P - Tannu
1个回答

5

看起来像是一个bug。(正如@aioros在评论中所提到的,这是bug #62476。)

不过,如果你创建了代表一年中第一天的DateTime对象,然后再添加所需的天数,就可以规避这个问题:

$date = 
    DateTime::createFromFormat("z Y","0 2016", new DateTimeZone("UTC"))
    ->add(new DateInterval("P69D"))
;
var_dump($date);

它显示:
class DateTime#2 (3) {
  public $date =>
  string(26) "2016-03-10 14:46:37.000000"
  public $timezone_type =>
  int(3)
  public $timezone =>
  string(3) "UTC"
}

更新:

PHP bug #62476的评论中提出了另一种解决方法,即先放置年份。

DateTime::createFromFormat("Y z","2016 69");

这样做可以按预期工作。


感谢您的解决方案和解释! - Andreas Pohl
这对我似乎不起作用。当我尝试转换当前日期时: DateTime :: createFromFormat('Y z','2020 189')它返回'2020-07-08 08:19:31.000000'。当我查看2020年的日期数字时,我发现7月7日是第189天,但createFromFormat返回7月8日。 :/ - Mr. Greenwoodz

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