【问题标题】:Wrong month (February) - DateTime::createFromFormat [duplicate]错误的月份(二月) - DateTime::createFromFormat [重复]
【发布时间】:2014-01-31 06:28:48
【问题描述】:

从字符串的日期转换返回第二个月(二月)的错误值:

$dtformat = 'Y-m-01';
$curDate = DateTime::createFromFormat('Y-m', '1996-02');
print_r($curDate);
$dt     = $curDate->format($dtformat);
echo $dt."\n";

返回“1996-03-01”,而不是“1996-02-01”。这是$currDate 数组:

DateTime Object ( 
    [date] => 1996-03-02 01:19:01 
    [timezone_type] => 3 
    [timezone] => America/New_York 
)

所有其他月份都可以正常工作。我在这里错过了什么?

谢谢!

【问题讨论】:

    标签: php


    【解决方案1】:

    根据post,这不是错误。

    原因:当我们不向createFromFormat 提供日期时,默认情况下将采用今天的日期。所以在这种情况下,1996-02-31 不存在,因此需要下个月。

    解决方案:需要提供一天来避免这种情况。

    $date = "2011-02";
    echo $date."\n";
    $d = DateTime::createFromFormat("Y-m-d",$date."-01");
    echo $d->format("Y-m");
    

    【讨论】:

    • 是的,似乎比每 2 个月调整一次更好的方法
    【解决方案2】:

    试试这个代码:

    $curDate = DateTime::createFromFormat('!Y-m', '1996-02');
    

    manual explains:


    将所有字段(年、月、日、小时、分钟、秒、分数和时区信息)重置为 Unix 纪元

    【讨论】:

    • '!Y-m' 会起作用。 '!'将所有字段(年、月、日、小时、分钟、秒、分数和时区信息)重置为 Unix 纪元。如果你把它放在年份之后,年份将重置为 1970 年。
    • 这对我有帮助,DateTime::createFromFormat("Ym", "200006")2000-07-01 16:47:26.000000DateTime::createFromFormat("!Ym", "200006")2000-06-01 00:00: 00.000000 - 大不同
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 2010-12-17
    • 2013-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多