我的用户在表单中输入数据以搜索日期。我收到的字符串格式可以是以下示例:tomorrow
,next week
,last year
或01/03/2017
。正如您所注意到的那样,根据设计,输入字段应尽可能灵活地为用户提供。
所以无论如何,问题是我的一些用户是英国人。因此,当他们输入1/3/2017
时,他们打算表示2017年3月1日。但是,以下代码:
Carbon::parse ($input);
将日期解释为2017年1月3日。在您通过建议像Carbon::createFromFormat()
这样的解决方案浪费您的时间和我的时间之前,请注意上面我注意到灵活性是此处功能的关键部分。
我认为我最终可能会做的是扩展Carbon{}
类和parse()
函数,然后用一些正则表达式交换字符串,以便1/3/2017
成为{{1}在被Carbon处理之前。
尽管如此,或许有些聪明的人知道有更好的方法让碳对语言/领地/地区敏感吗?
非常感谢!
答案 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时代,所以不应该太难。