【问题标题】:PHP date change strtotime does not work wellPHP日期更改strtotime不能正常工作
【发布时间】:2021-08-20 08:41:00
【问题描述】:

日期未正确更改格式(YYYYMM -> YYYYY-MM)。

我想将 YYYYMM (int) 更改为 YYYY-MM 以使用 HTML 月份输入

我是这样实现的……但 $s_month 总是以某种方式显示 2021-06

                {{$test->month }}//202005
@php
                $s_month= $test->month ? date('Y-m',strtotime($test-> month)):"";
@endphp
{{$s_month}} // it displays 2021-06
<input name="s_month" type="month" value="{{$s_month?? ''}}"></input>

【问题讨论】:

  • 使用 DateTimeCarbon 类。 strtotime 不太可靠,因为它只能猜测它接收到的格式,而这些类有一个明确的方法来从特定格式创建日期对象。
  • 2020-05 的输入下工作正常,但在202005 的输入下工作正常,所以我改变了问题,所以它有意义
  • 简单的解决方案,将01 连接到YYYYMM 以生成有效的完整日期,然后它将起作用所以date('Y-m',strtotime($test-&gt; month . '01'))

标签: php laravel laravel-blade date-formatting


【解决方案1】:

strtotime(正确地)不够聪明,无法解析没有分隔符的字符串,因为值可以是任何值,毫秒、纳秒、纪元等。一种选择是添加分隔符:

$originalDate = '202005';
$separateDate = substr($originalDate, 0, 4) . '-' . substr($originalDate, 4, 6); // 2020-05

此时您需要手动删除原始日期,但为了完整起见并确保我们已经完成目标,我们可以在日期对象中使用此字符串。

$intendedDate = date('Y-m', strtotime($separateDate)); // 2020-05

另外,作为mentioned by @shaedrichCarbon 非常有用,可以更优雅地完成此任务。

【讨论】:

    【解决方案2】:

    Carbon解决方案:

    use Carbon\Carbon;
    ...
    $s_month= $test->month ? Carbon::createFromFormat('Ym', $test->month)->format('Y-m') : "";
    

    原生DateTime解决方案:

    $s_month= $test->month ? DateTime::createFromFormat('Ym', $test->month)->format('Y-m') : "";
    

    【讨论】:

    • 不是很有帮助,很可能是 OP,或者未来的访问者不会知道 Carbon。因此,如果他们想使用它,您必须告诉他们如何安装它。它不是 DATETIME 类所在的普通 PHP
    • 他们不需要安装它,因为 Laravel 只安装了它。否则我不会使用它。
    • @RiggsFolly 我添加了原生 DateTime 解决方案
    • 当然。也不是每个找到此问答的人都会使用 Blade。我们也没有要求主题所有者重新表述他们的问题。
    • 我倾向于同意@shaedrich 的观点——标签明确表明这是一个 Laravel 问题,但我同意尽可能提供简单的语言解决方案.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多