如何使 CakePHP 3 次对象在 AJAX 和 PHP 之间保持一致?

How can I make a CakePHP 3 time object remain consistent between AJAX and PHP?

当我加载带有 Time 对象的页面并通过 PHP 在页面上回显时,我得到:

<?= $user->last_login ?>
// 12/30/14, 5:21 pm

当我通过 ajax 加载数据时,它 return 给我的是这样的:

console.log(response.user.last_login);
// 2014-12-30T17:21:31+0000

我没有设置任何与默认 CakePHP 3 设置不同的东西,我需要添加到页面的事件(return 通过 ajax 编辑)时间格式与页面加载时拉取的事件相同(return 通过 PHP)。

您可以使用 javascript Date object

转换日期格式

JSFiddle

var date = new Date(response.user.last_login)
//returns a timestamp of 1419960091000

var n = date.getTime();

var day = date.getDate();
var month = date.getMonth();
month = month + 1;
//increment the month by 1 as it starts from 0
var year = date.getFullYear();
year = year.toString().substr(2,2); 
//this removes the first 2 characters to give yy, remove the above line for yyyy
var hours = date.getHours();
var minutes = date.getUTCMinutes();

var period='am';
if(hours==0){ //At 00 hours we need to show 12 am
    hours=12;
}
else if(hours>12){
    hours=hours%12;
    //remove the above line for 24 hour format
    period='pm';
}

现在您可以按照要求的格式拼凑日期

var last_login = day + '/' + month + '/' + year + ' ' + hours + ':' + minutes + ' ' + period;
//gives 30/12/14 5:21 pm

希望对您有所帮助!

Time 对象的默认字符串格式输出由 setToStringFormat 方法控制 http://book.cakephp.org/3.0/en/core-libraries/time.html#setting-the-default-locale-and-format-string

最好不要在此处对格式进行硬编码,而是仅更改当前语言环境以便为您选择正确的格式,

但是用于编码为 json 的格式无法通过配置来控制它,因为在 JSON API。相反,您可以做的是更改 User 实体中的 jsonSerialize 方法:

public function jsonSerialize() {
    $toEncode = parent::jsonSerialize();
    return ['last_login' => (string)$this->last_login] + $toEncode;
}

它所做的是在将 last_login 属性 编码为 json 之前将其转换为字符串。转换为字符串将使用全局配置的 toString 格式。