Carbon::parse -> 设置默认为英国格式

Carbon::parse -> set default to UK format

我的用户在表单中输入数据以搜索日期。我收到的字符串的格式可以按照以下示例:tomorrownext weeklast year01/03/2017。正如您所注意到的,输入字段旨在为用户提供尽可能灵活的设计。

所以无论如何,问题是我的一些用户是英国人。因此,当他们输入 1/3/2017 时,他们打算表示 2017 年 3 月 1 日。但是,以下代码:

Carbon::parse ($input);

将日期解释为 2017 年 1 月 3 日。在您通过建议 Carbon::createFromFormat() 之类的解决方法来浪费您和我的时间之前,请注意上面的一点,我注意到灵活性是此处功能的关键部分。

我想我最终可能要做的是扩展 Carbon{} class 和 parse() 函数,然后用一些正则表达式交换字符串,以便 1/3/2017在被 Carbon 处理之前变为 3/1/2017

不过,也许有些聪明的人知道更好的方法让 Carbon 对 language/territory/region 敏感?

非常感谢!

好的,这是我想出的代码片段,它将接受 Carbon 有效字符串,如 "tomorrow" 等或 Unix 时间纪元。

$dt = is_numeric($userDate)? Carbon::createFromTimestamp((float)$userDate) 
                        : new Carbon($userDate);

我们的想法是始终向服务器发送一致的格式,并在将它们发送到服务器之前在客户端进行所有转换。每个语言平台都有将时间从语言环境转换为 unix 纪元的工具,所以应该不会太难。

正如您提到的,通过做这样的事情来制作替代碳 class 怎么样?

config/app.php

<?php

'aliases' => [
    // all of the aliases
    'Carbon' => App\Carbon::class,
],

然后创建这个 class:

<?php

namespace App;

use Carbon\Carbon as BaseCarbon;

class Carbon
{
    public static function parse($time = null, $tz = null)
    {
        try {
            return BaseCarbon::createFromFormat('d-m-Y', $time, $tz);
        } catch (\Exception $e) {
            // This will allow you to catch on when you pass a string like "tomorrow"
            return BaseCarbon::parse($time, $tz);
        }
    }
}

现在您可以 Carbon::parse('2-3-2010'); 并将其视为 2010 年 3 月 2 日,或者 Carbon::parse('tomorrow'); 并将其视为明天。

您可以想出其他方法来构建此格式,以便可以根据用户区域设置或其他内容来指定格式。

当你知道去哪里找的时候!! http://php.net/manual/en/datetime.formats.php

显然以下内容是正确的:

$american = Carbon::parse ('1/3/2017'); // Jan 3, 2017
$european = Carbon::parse ('1-3-2017'); // 1 March, 2017

所以将斜杠改为破折号(或破折号改为斜杠)就是我想要的答案!