Carbon createFromFormat意外结果

时间:2016-07-31 09:55:56

标签: php php-carbon

:: createFromFormat()导致提前一个月:

var_dump($_GET['archive']);
var_dump(Carbon::createFromFormat('m/Y', $_GET['archive']));

结果:

string '11/2015' (length=7)
object(Carbon\Carbon)[160]
  public 'date' => string '2015-12-01 10:38:41.000000' (length=26)
  public 'timezone_type' => int 3
  public 'timezone' => string 'Europe/London' (length=13)

2 个答案:

答案 0 :(得分:1)

如果没有提供,碳似乎使用当天。因此

var_dump(Carbon::createFromFormat('m/Y', '10/2015'));
var_dump(Carbon::createFromFormat('m/Y', '11/2015'));

结果,例如7月31日在

object(Carbon\Carbon)[156]
  public 'date' => string '2015-10-31 11:03:10.000000' (length=26)
  public 'timezone_type' => int 3
  public 'timezone' => string 'Europe/London' (length=13)
object(Carbon\Carbon)[138]
  public 'date' => string '2015-12-01 11:03:10.000000' (length=26)
  public 'timezone_type' => int 3
  public 'timezone' => string 'Europe/London' (length=13)

10月份排在第31位但是“11月31日”实际上是12月1日"。

答案 1 :(得分:1)

似乎你只是因为你在本月31日进行测试而感到不幸。

然而,这(显然)是一个记录在案的特征。请参阅:http://php.net/manual/en/datetime.createfromformat.php

如果您正确设置格式掩码"",它可以正常运行。

$x = Carbon::createFromFormat   ('m/Y', '04/2009');
$y = DateTime::createFromFormat ('m/Y|', '04/2009');
dd ($x, $y);

为了避免歧义,Carbon函数只是PHP的基础DateTime函数的包装器;我的目的是证明这不是引起我们头痛的Carbon功能。

如果您在本月31日进行测试,则上面$x将被视为31 April 2009,该显示将显示为5月1日。

使用掩码中的管道符号,所有未声明的时间变量(His)都设置为零,并且日期变量({{1 },d)设置为1,因此无论一周中的某一天如何,m始终会按预期做出响应。

对于我在当月第4天晚上17:46进行测试,上面的代码产生以下内容:

$y

在我看来,这是一个非常奇怪的日期/时间函数实现。您想要使用此功能的唯一真实情况是,您是否正在从外部源(例如XML" date"字段)读取数据。

地球上哪个程序员希望他们的程序假设输入数据的缺失时间(或在你的情况下,天)组件应该从运行时执行时间中获取?这绝对是疯狂的疯狂。