【问题标题】:How to remove time information from date in this json structure?如何从这个 json 结构中的日期中删除时间信息?
【发布时间】:2015-10-27 08:10:08
【问题描述】:

我正在使用 cakephp v3。

我有一个简单的模型函数;

public function getXXXoutput($xxx_term, $start_date, $end_date)    
{           
    $monthly_XXX_curves = TableRegistry::get('MonthlyXXXCurves');        
    $query = $monthly_XXX_curves
            ->find()                        
            ->select( ['date_transacted', 'output'] ) 
            ->toArray();

    return $query;        
}

控制器功能如下所示;

public function apiGetXXX()
{
    $json_output = $this->MonthlyXXXCurves->getXXXoutput($xxx_term, $start_date, $end_date);
    echo json_encode($json_output);
}

控制器返回的json格式是这样的;

[
{
output: 1.37,
date_transacted: "2015-01-01T00:00:00+0000"
},
{
output: 1.62,
date_transacted: "2015-02-01T00:00:00+0000"
}
]

我想从date_transacted 中删除时间信息,这样最终的 json 结构将如下所示;

[
{
output: 1.37,
date_transacted: "2015-01-01"
},
{
output: 1.62,
date_transacted: "2015-02-01"
}
]

如何修改控制器函数来实现想要的json结构?

【问题讨论】:

  • 你想在从数据库中获取的时候这样做吗??
  • @Niranjan N Raju,只要我得到想要的 json 结构就没有偏好
  • $start_date$end_date是什么格式?
  • #Peter,它们是字符串格式

标签: php json date cakephp cakephp-3.0


【解决方案1】:

在查询中选择 date_transacted 并格式化为 DATE

public function getXXXoutput($xxx_term, $start_date, $end_date)    
{           
    $monthly_XXX_curves = TableRegistry::get('MonthlyXXXCurves');        
    $query = $monthly_XXX_curves
            ->find()                        
            ->select(['transacted' => 'DATE(date_transacted)', 'output']) 
            ->toArray();

    return $query;        
}

【讨论】:

  • 我试过了,但它不起作用。出现语法错误“SQLSTATE[42000]:语法错误或访问冲突:”
  • 阅读如何使用SQL函数book.cakephp.org/3.0/en/orm/…
  • @Salines 你通过fields' to select`,而不是日期对象。
  • 在书中你有示例如何格式化日期book.cakephp.org/3.0/en/orm/…
  • 选择您的答案作为正确答案,因为它是 Cakephp 方式。谢谢!
【解决方案2】:

我不熟悉 CakePHP,所以不知道这一切是如何处理的。我所知道的是$json_output 是一个数组,因此可以循环和修改。

foreach ($json_output as $key => $value) {
    $date = new DateTime($json_output[$key]['date_transacted']);
    $json_output[$key]['date_transacted'] = $date->format('Y-m-d');
}

在前面添加上述内容:

echo json_encode($json_output);

【讨论】:

  • 稍作修改后即可使用。由于 cakephp 中的命名空间问题,将 DateTime 更改为 '\DateTime'。
  • 一件事我不明白。为什么不使用 $value 时还需要它?
  • @user768421 如果我不使用该值,我将无法使用该密钥。我可以使用$value['date_transacted']。没有区别。
【解决方案3】:

当您使用ORM 获取记录时,它会带回date and time fields 作为从Carbon 扩展而来的Cake\I18n\Time 对象,而CarbonDateTime 扩展而来。您可以直接调用i18nFormatformat 方法。

在底层,CakePHP 使用 Carbon 来支持它的 Time 实用程序。任何你可以用 Carbon 和 DateTime 做的事情,你都可以用 Time 做。 有关 Carbon 的详细信息,请参阅their documentation

CakePHP - Time

$date_transacted->format('Y-m-d');

【讨论】:

    猜你喜欢
    • 2012-12-26
    • 1970-01-01
    • 2019-08-25
    • 2019-07-05
    • 1970-01-01
    • 2017-09-09
    • 2020-01-23
    • 1970-01-01
    • 2019-09-18
    相关资源
    最近更新 更多