You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JavaScript中正确显示来自JSON记录的日期数据

问题描述

我有一段可正常运行的代码,用alert显示日期时,会呈现这样的格式:Thu Dec 28 2023 00:00:00 GMT+0100 (West Africa Standard Time),代码如下:

$(document).ready(async function(){

function rec(el, data, settings){

var obj = data;
console.log(obj);
}

var events = [
  {'Date': new Date(2023, 10, 28), 'Title': 'title 1'},
  {'Date': new Date(2023, 11, 28), 'Title': 'title 2'},
  {'Date': new Date(2022, 12, 27), 'Title': 'title 3'},
];
// alert date sample
alert(events[0].Date);

var settings = {};
var element = document.getElementById('caleandar');
rec(element, events, settings);

});

现在我通过fetch API调用PHP后端获取记录,运行后执行alert(events[0].Date);,得到的是**new Date(2023, 10, 28)**这样的字符串,不是期望的日期格式。我需要把所有日期都转换成期望的格式。

相关代码如下:

index.html

$(document).ready(async function(){

function rec(el, data, settings){
var obj = data;
console.log(obj);
}

const response = await fetch('http://localhost/record.php', {
    method: 'GET'
});

var events = await response.json();
alert(events[0].Date);

var settings = {};
var element = document.getElementById('caleandar');
rec(element, events, settings);

});

record.php

/*
$return_arr = array();

$query = "SELECT * FROM usera";

$result = mysqli_query($con,$query);

while($row = mysqli_fetch_array($result)){
    $Date = $row['Date'];
    $title = $row['title'];
    $link = $row['link'];

    $return_arr[] = array(
                    "Date" => $Date,
                    "Title" => $title,
                    "Link" => $link);
}

// Encoding array in JSON format
 json_encode($return_arr);
*/

    $arr = array(
        array(
            "Date" => "new Date(2023, 10, 28)",
            "Title" => "title 1"
        ),
        array(
            "Date" =>  "new Date(2023, 11, 28)",
            "Title" => "title 2"
        ),
        array(
               "Date" =>  "new Date(2023, 11, 28)",
            "Title" => "title 3"
        )
    );
    
    echo json_encode($arr);
解决方案

方法一:修改后端PHP代码,传递可解析的日期格式

目前PHP返回的是"new Date(2023, 10, 28)"字符串,前端无法直接识别为Date对象。推荐后端传递时间戳或者ISO标准日期字符串,前端再转换为Date对象:

方案1:传递时间戳

修改PHP中Date字段的赋值,把日期转换为时间戳:

// 手动构造数据示例
$arr = array(
    array(
        "Date" => strtotime("2023-11-28"), // 注意:JavaScript月份从0开始,PHP从1开始,这里2023-11对应JS的10月
        "Title" => "title 1"
    ),
    // 其他项同理
);

// 从数据库读取日期时,直接转时间戳
// $Date = strtotime($row['Date']);

前端接收后转换为Date对象:

var events = await response.json();
// 遍历数组,将每个Date字段转为Date对象
events = events.map(item => {
    item.Date = new Date(item.Date * 1000); // PHP时间戳是秒级,JS是毫秒级,需乘1000
    return item;
});
alert(events[0].Date); // 此时会显示期望的日期格式

方案2:传递ISO日期字符串

PHP直接输出ISO格式的日期字符串:

// 手动构造数据示例
$arr = array(
    array(
        "Date" => "2023-11-28T00:00:00", // ISO格式,JS可直接解析
        "Title" => "title 1"
    ),
    // 其他项同理
);

// 数据库读取日期时,格式化为ISO格式
// $Date = date('c', strtotime($row['Date'])); // 'c'对应ISO 8601标准格式

前端直接转换:

var events = await response.json();
events = events.map(item => {
    item.Date = new Date(item.Date);
    return item;
});
alert(events[0].Date);

方法二:前端解析现有字符串格式

如果暂时无法修改后端,可以在前端解析"new Date(2023, 10, 28)"这种固定格式的字符串:

var events = await response.json();
events = events.map(item => {
    // 提取括号内的参数
    const dateParams = item.Date.match(/new Date\((.*?)\)/)[1];
    // 转为数字数组后传入Date构造函数
    item.Date = new Date(...dateParams.split(',').map(Number));
    return item;
});
alert(events[0].Date);

注意:这种方法依赖字符串格式完全固定,后端输出格式变化就会失效,优先推荐后端传递标准格式。

内容的提问来源于stack exchange,提问作者Nancy Moore

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 18:16:33