如何将JSON格式的日期字符串解析为日期格式

8

我正在做的是,使用ajax从数据库中获取数据,并将其显示在html文本框中以便进行更新。以下是我的Web方法代码,从中我成功获取到数据。

[WebMethod]
public static List<Employee> getEmployee()
{
     var slist = new List<Employee>();
     var db = new BLUEPUMPKINEntities();
     slist = db.Employees.ToList();
     return slist;
}

现在当我从数据库中获取数据时,日期的格式如下:/Date(725828400000)/。我搜索了谷歌关于解析和转换JSON日期字符串格式成HTML/javascript日期,也尝试使用第三方插件如moment.js和jquery.ui,但都无法解决我的问题。同时,我在此分享我从AJAX以JSON格式获取数据并在jquery数据表中显示的代码。
$.ajax({
    url: "Employees.aspx/getEmployee",
    data: null,
    contentType: "Application/json; charset=utf-8",
    responseType: "json",
    method: "POST",
    success: function (response) {
        //alert(response.d);

        var jsonObject = response.d;
        var result = jsonObject.map(function (item) {
            //var date = new Date(item.EMP_DOB);
            //var obj = Date.parse(date);
            var result = [];
            result.push('');
            result.push(item.EMP_FNAME);
            result.push(item.EMP_MNAME);
            result.push(item.EMP_LNAME);
            result.push(item.EMP_EMAIL);
            result.push(item.EMP_DOB); //this is my date column in my database from where date is in yyyy/mm/dd format
            result.push(item.EMP_USERNAME);
            result.push(item.EMP_PASSWORD);
            result.push(item.ID);
            return result;
        });
        myTable.rows.add(result); // add to DataTable instance
        myTable.draw();
    },
    error: function (xhr) {
        alert(xhr.status);
    },
    Failure: function (response) {
        alert(response);
    }
});

我希望日期以 mm/dd/yyyy 格式显示。请帮我解决这个问题。


1
从服务器发送ISO日期字符串。 - charlietfl
5个回答

6
如果添加依赖没有问题,那么您可以添加moment.js,它将帮助您以任何格式格式化数据。我假设服务器的日期格式为'/Date(725828400000)/'
var d = item.EMP_DOB;
result.push(moment(Number(d.match(/\d+/)[0])).format('MM/DD/YYYY'));

如果您无法添加moment js,则可以执行以下操作:
var date = new Date(Number(d.match(/\d+/)[0]));
var day = date.getDate();
day = day = (day < 10) ? ("0" + day) : day;
var month = date.getMonth() + 1);
month = (month < 10) ? ("0" + month) : month;
var dateStr = day + "-" + month + "-" + date.getFullYear();
result.push(dateStr);

感谢您的正确答案。它对我有用。但是这里还有一个问题,即 <asp:Content ID="Content1" ContentPlaceHolderID="Employees_head" runat="server"> <script src="../Scripts/moment.js"></script> <script src="../js/ajaxcall.js"></script> </asp:Content> Moment js无法访问我的ajaxcall外部文件。因此,我将ajaxcall --> getEmployee()方法放在外部文件之外,以便可以轻松地从中访问它。但是我想访问我的moment()到我的ajaxcall方法中,因为在该方法中我放置了所有ajax方法。 - Ahmer Ali Ahsan
你之前的代码展示了正确的格式,为什么要进行编辑呢?实际上,主要问题是moment()方法无法在我的ajaxcall.js文件中访问。我之前已经将moment.js文件引用放在前面,但它仍然无法被ajaxcall访问。如果你能告诉我如何在外部文件ajaxcall.js中引用moment.js,我将非常感激你。 - Ahmer Ali Ahsan
实际上@charlietfl对那个答案进行了投票,如果您无法插入moment js,则可以创建一个函数来格式化您的日期。 - Zohaib Ijaz
谢谢@ZohaibIjaz,你的代码很好地解决了我的问题。 - Ahmer Ali Ahsan
@AhmerAliAhsan 但是对于 date.getMonth() + 1),有一个特殊情况,如果月份小于10,则会得到单个数字。 - Zohaib Ijaz
显示剩余5条评论

0
最简单的方法如下(无需第三方js)
var data =from row in db.Employees.ToList()
 select new {
    EMP_DOB=row.EMP_DOB.ToString(), row.EMP_FNAME,row.EMP_MNAME,row.EMP_LNAME
     row.EMP_EMAIL,row.EMP_DOB,row.EMP_USERNAME,row.EMP_PASSWORD,row.ID
 };

如果你想格式化日期,可以使用以下代码:

var data =from row in db.Employees.ToList()
     select new {
         EMP_DOB=Convert.ToString(row.EMP_DOB).ToShortDateString(), other properties goes here as shown previously
     };

你可以使用C#对它进行任何想要的格式化。


谢谢您的评论,但您的答案对我没有用。 - Ahmer Ali Ahsan
这个错误突出显示在 row.EMP_DOB.ToString() 上,无效的匿名类型成员声明。匿名类型成员必须使用成员赋值、简单名称或成员访问声明。 - Ahmer Ali Ahsan
我刚刚编辑了我的回答,我在外面,所以没能及时回复。如果你愿意,可以查看一下。客户端不需要做任何事情。 - Mir Gulam Sarwar

0

这个方法将把所有你的 WCF 类型日期转换成 javascript 的 Date 对象:

var dateRegex = /^\/Date\((d|-|.*)\)[\/|\\]$/;

function convertWCFStringDate(strDate) {
    var matched = dateRegex.exec(strDate);
    if (matched) {
        var parts = matched[1].split(/[-+,.]/);
        return new Date(parts[0] ? +parts[0] : 0 - +parts[1]);
    }
}

0

-1
var dbDate = "2014/03/12";    
var date    = new Date(dbDate); 

// 在硬编码日期的位置放置您的字符串

对于您的情况,您从数据库中获取一个长整型值作为字符串。添加一行代码:

 var newDate = parseInt("725828400000"); // use here your item.EMP_DOB;

现在将这个值传递给你的对象。就像这样:
var date = new Date(newDate);


var mm = (date.getMonth()+1)>9?(date.getMonth()+1):"0"+(date.getMonth()+1);
var dd = date.getDate()>9?date.getDate():"0"+date.getDate();
var yyyy = date.getFullYear();
var newDate = mm+"/"+"/"+dd+"/"+yyyy;
alert(dbDate+" converted to "+newDate)

我得到的日期格式是/Date(725828400000)/,而不是"2014/03/12"。 - Ahmer Ali Ahsan
var date = new Date(item.EMP_DOB) // 出现 NaN 错误 - Ahmer Ali Ahsan
尝试这个: var newDate = parseInt("725828400000"); // 在此处使用您的item.EMP_DOB;现在将此值传递给您的对象。例如 var date = new Date(newDate); 您正在将长值作为字符串传递,因此无法解析。 - zakaiter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接