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

时间:2017-10-15 18:57:10

标签: php laravel php-carbon

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

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

Carbon::parse ($input);

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

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

尽管如此,或许有些聪明的人知道有更好的方法让碳对语言/领地/地区敏感吗?

非常感谢!

3 个答案:

答案 0 :(得分:2)

当你知道在哪里看!! 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

所以改变斜线到短划线(或破折号到斜线)就是我追求的答案!

答案 1 :(得分:1)

正如你所提到的那样,通过做这样的事情来替换Carbon课程呢?

config / app.php

<?php

'aliases' => [
    // all of the aliases
    'Carbon' => App\Carbon::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');,明天就可以了。

您可以找出构建此方法的其他方法,以便格式可以根据用户区域设置或特定内容进行特定。

答案 2 :(得分:0)

好的,所以这里是我提出的代码片段,它将接受碳有效字符串,如“明天”等,或者Unix时间纪元。

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

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