【问题标题】:Convert Datetime to PHP将日期时间转换为 PHP
【发布时间】:2017-07-30 01:05:43
【问题描述】:

我有一个日期时间字符串,例如14/04/2014 4:57:16 PM,我正在使用碳日期时间来处理它。

但是一旦我尝试这样做

$dt = Carbon::createFromTimestampUTC($encDateTime);

但是我收到解析错误: DateTime::__construct(): Failed to parse time string (@14/04/2014 5:03:45 PM) 在位置 3 (/): 意外字符。

更新: 我试过这样做:

$date = DateTime::createFromFormat('d/m/Y H:i A', $encDateTime);
dd($date->format('Y-m-d H:i:s'));

我收到以下错误 在非对象上调用成员函数 format()

你能帮我解决这个问题吗?

谢谢

【问题讨论】:

  • var_dump($encDateTime); 输出什么?
  • @AmalMurali :它返回这个:14/04/2014 4:57:16 PM
  • @Gagan:var_dump() 永远不会返回那个。确切的输出是什么?
  • 我也可能弄错了,但在您的 update 中,您使用 H 表示 2 位数小时,而不是 h - 这可能导致字符串无法正确解析
  • @AmalMurali:我很确定它会返回给我这个:string(22) "14/04/2014 5:13:18 PM" .. 如果可以请告诉我你还有什么期待也许我可以提供相关的答案 - 谢谢

标签: php laravel laravel-4 php-carbon


【解决方案1】:

您的日期字符串末尾包含一个空格 - 这就是 DateTime::createFromFormat() 无法解析它的原因。要从开头和/或结尾删除多余的空格,您可以使用trim()

此外,您最初使用的是H,这是带有前导零的 24 小时格式。在这种情况下,您的格式似乎是 12 小时制,因此请改用 gh 也可以)。

以下应该有效:

$date = DateTime::createFromFormat('d/m/Y g:i:s A', trim($encDateTime));

当您收到此类错误时,始终var_dump()。这样,您可以检查变量是否包含您认为的内容。

【讨论】:

  • 感谢大家解决我的问题 - 让我沉闷的星期一下午看起来不错 - 谢谢
【解决方案2】:

当出现解析错误时,来自 DateTime 的静态方法 createFromFormat 返回 NULL。给出的格式 (d/m/Y H:i A) 是错误的。因此出现错误“在非对象上调用成员函数 format()”。

您可以像这样从非标准时间字符串创建 DateTime 对象:

$time = '14/04/2014 4:57:16 PM';
$date = Carbon\Carbon::createFromFormat('d/m/Y g:i:s A', $time);

可用的不同格式字符及其解释可在the documentation for date() 中找到。

【讨论】:

  • 我不确定这如何回答 OP 的原始问题?
  • 我不明白你的意思。 Carbon 类显然无法解析日期字符串。 Failed to parse time string (@14/04/2014 5:03:45 PM ) at position 3 (/): Unexpected character.
  • @AmalMurali - 老实说,确实如此。我正在使用碳日期时间,正如我在问题中已经提到的那样。但你也是正确的。有一个尾随空格,修剪它真的很有帮助。如果您可以将您的回复作为答案发布,我会将其标记为答案,同时我会支持 hannesvdvreken 的答案
  • 我已经删除了对您答案的引用,因为我认为我的答案是没有那个 OP 的问题。我还改写了您的答案并稍微修改了格式-希望您不介意。如果您不喜欢它,请恢复 :)
  • @AmalMurali 我注意到你删除了引用。
【解决方案3】:

我对 Carbon 一无所知,但这很有效。您在 createFromFormat 方法中使用的是两位数 (H) 而不是 h(编辑:g 是完全相同的东西):

$encDateTime = "14/04/2014 4:57:16 PM";

$date1 = DateTime::createFromFormat('d/m/Y h:i:s A', trim($encDateTime));
echo $date1->format('Y-m-d H:i:s');

结果:

2014-04-14 16:57:16

【讨论】:

  • 其实是错的。 h 必须是 g。对不起。
  • 不管怎样,关键是 OP 使用了 H ,它期望 2 位数的小时。同样在我的测试中,这工作得很好,那为什么是 g?我在 24 小时范围内的每一个小时都尝试过,没有失败。
  • 实际上,是的,你错了 - g 和 h 小时的 12 小时格式,带或不带前导零 1 到 12 或 01 到 12。g 和 h 是一回事。 (us3.php.net/manual/en/function.gmdate.php)
  • 老兄...14/04/2014 4:57:16。前导零在哪里?
  • 没有前导零,也就是为什么你使用 h(或 g)而不是 H。停止试图拖钓我:p
【解决方案4】:

只需使用 laravel 日期函数作为:

$productsales=DB::table('tbl_trans')   
     ->leftjoin('tbl_product','tbl_product.prod_id','=','tbl_trans.product_id')  
     ->select(DB::raw('count(product_id) as quant'),'product_id','tbl_product.name','tbl_product.code','tbl_product.price')    
     ->groupBy('product_id','code','name','price')    
     ->whereDate('tbl_trans.created_at','2017-07-29')  
     ->get();


   return view('reports.productsales',compact('productsales'));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    • 2013-12-17
    • 2011-01-06
    • 2011-05-22
    • 2013-09-12
    • 2012-08-28
    相关资源
    最近更新 更多