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

.NetCore数据接入Google Chart时日期类型不匹配问题求助

解决Google Chart与.NET Core DateTime类型不匹配问题

我之前也碰到过一模一样的问题,核心原因是Google Chart的date列类型要求值是JavaScript的Date对象或特定格式的日期数组,而我们后端返回的2018-04-22T00:00:00是ISO格式的字符串,被识别成了string类型,所以才会抛出类型不匹配的错误。下面给你几个可行的解决方法:

方法一:后端返回时间戳,前端转换为Date对象

修改后端的GetProdVal方法,把DateTime转换为从1970-01-01 UTC开始的毫秒时间戳:

public List<object[]> GetProdVal() 
{ 
    List<object[]> value = new List<object[]>(); 
    foreach (var item in valuelist) 
    { 
        // 将DateTime转换为毫秒级时间戳
        long timestamp = new DateTimeOffset(item.Date).ToUnixTimeMilliseconds();
        object[] val = { timestamp, item.TotalCost }; 
        value.Add(val); 
    } 
    return value; 
}

前端拿到数据后,把时间戳转为JavaScript的Date对象再添加到图表:

prodval_chartData = @Json.Serialize(ViewBag.productionvalue, new Newtonsoft.Json.JsonSerializerSettings { StringEscapeHandling =Newtonsoft.Json.StringEscapeHandling.EscapeHtml}); 
var prodval_data = new google.visualization.DataTable(); 
prodval_data.addColumn('date', 'Date'); 
prodval_data.addColumn('number', 'Total'); 

// 转换时间戳为Date对象
var formattedRows = prodval_chartData.map(row => {
    return [new Date(row[0]), row[1]];
});

prodval_data.addRows(formattedRows);

方法二:后端直接返回Google Chart识别的日期数组

Google Chart的date类型可以直接识别[年, 月(0-11), 日]格式的数组(注意JS的月份是从0开始的,所以要减1),后端直接构造这种格式:

public List<object[]> GetProdVal() 
{ 
    List<object[]> value = new List<object[]>(); 
    foreach (var item in valuelist) 
    { 
        // 构造Google Chart兼容的日期数组
        object[] dateParts = { item.Date.Year, item.Date.Month - 1, item.Date.Day };
        object[] val = { dateParts, item.TotalCost }; 
        value.Add(val); 
    } 
    return value; 
}

这种方式下前端不需要额外处理,直接调用addRows即可:

prodval_chartData = @Json.Serialize(ViewBag.productionvalue, new Newtonsoft.Json.JsonSerializerSettings { StringEscapeHandling =Newtonsoft.Json.StringEscapeHandling.EscapeHtml}); 
var prodval_data = new google.visualization.DataTable(); 
prodval_data.addColumn('date', 'Date'); 
prodval_data.addColumn('number', 'Total'); 
prodval_data.addRows(prodval_chartData);

方法三:前端直接转换ISO字符串为Date对象

如果不想修改后端代码,也可以在前端把返回的ISO日期字符串直接转为Date对象:

prodval_chartData = @Json.Serialize(ViewBag.productionvalue, new Newtonsoft.Json.JsonSerializerSettings { StringEscapeHandling =Newtonsoft.Json.StringEscapeHandling.EscapeHtml}); 
var prodval_data = new google.visualization.DataTable(); 
prodval_data.addColumn('date', 'Date'); 
prodval_data.addColumn('number', 'Total'); 

// 转换ISO日期字符串为Date对象
var formattedRows = prodval_chartData.map(row => {
    return [new Date(row[0]), row[1]];
});

prodval_data.addRows(formattedRows);

这三种方法都能解决类型不匹配的问题,你可以根据自己的项目情况选择最合适的一种。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:07:29