【问题标题】:Zero date in Carbon碳中的零日期
【发布时间】:2016-11-22 14:02:52
【问题描述】:

我有一些静态文本文件需要解析。

在这些文件中,我的日期格式为YmdYmYmdHis 甚至His,但我可以管理。

问题(artisan tinker的输出):

>>> $date = \Carbon\Carbon::createFromFormat('Ymd', '20160415', 'UTC')
=> Carbon\Carbon {#1315
     +"date": "2016-04-15 15:00:22.000000",
     +"timezone_type": 3,
     +"timezone": "UTC",
   }
>>> $date->format('Ymd')
=> "20160415"

>>> $date = \Carbon\Carbon::createFromFormat('Ymd', '00000000', 'UTC')
=> Carbon\Carbon {#1076
     +"date": "-0001-11-30 15:00:31.000000",
     +"timezone_type": 3,
     +"timezone": "UTC",
   }
>>> $date->format('Ymd')
=> "-00011130"

当日期是正确的日期(示例中为 2016-04-14)时,一切正常,但是当我得到 日期并将其传递给 Carbon 时,它会将其更改为 -1 年 11 月 30 日

有没有办法教Carbon 在这种情况下如何表现?

【问题讨论】:

  • 没有零月或零日,因此它将其解释为前一年的最后一个月,然后是前一个月的最后一天。你期待什么日期?
  • garbage in garbage out,在发送给 Carbon 之前确定日期
  • 文件来自第三方,遗憾的是我无法修改它们的结构,也无法修改它们如何“可视化”空/未设置日期
  • "Is there a way to teach Carbon how to behave in situation like this?" 应该如何表现?
  • @vascowhite 就个人而言,我认为它应该向上或向下取整——也许是一个选择。我的偏好是四舍五入。例如。如果过去的日期为零,则它将成为本月的第一天,而不是上个月的最后一天

标签: php laravel date datetime php-carbon


【解决方案1】:

您必须检查日期是否大于最小日期 (Carbon::minValue()) 并在必要时进行更正(例如,使其等于最小日期或将其设置为“从不”)。

>>> $date = \Carbon\Carbon::createFromFormat('Ymd', '00000000', 'UTC');
=> Carbon\Carbon @-62169953296 {#3106
     date: -0001-11-30 08:31:44.0 UTC (+00:00),
     timezone: "UTC",
   }
>>> if ($date < \Carbon\Carbon::minValue()) $date = \Carbon\Carbon::minValue();
=> Carbon\Carbon @-62135601840 {#3125
     date: 0001-01-01 00:00:00.0 Europe/Warsaw (+01:24),
     timezone: "Europe/Warsaw",
   }

【讨论】:

    猜你喜欢
    • 2017-09-06
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-20
    • 2017-08-25
    • 2018-03-16
    相关资源
    最近更新 更多