我目前正在处理一个基于餐厅网络的项目,但Datetime遇到问题。

我有一个WebMethod,它将表预订添加到SQL Server数据库。

[WebMethod]
public void AddTable(string first, string last, string email, long telephone, int people, string special, DateTime bookingDate)
{
    using (BookingLinqDataContext bl = new BookingLinqDataContext())
    {
        bl.AddTable(first, last, email, telephone, people, bookingDate, special);
    }
}

这是来自Ajax调用的解析数据:
$("#AddTableBut").click(function () {
    var firstName = $("#FirstName").val();
    var lastName = $("#LastName").val();
    var email = $("#Email").val();
    var telephone = $("#Telephone").val();
    var numberPeople = $("#NumberPeople").val();
    var date = $("#DateComing").val();
    var special = $("#SpecialReq").val();

    var Book = {
        'first': firstName,
        'last': lastName,
        'email': email,
        'telephone': telephone,
        'people': numberPeople,
        'special': special,
        'bookingDate': date
    }

    $.ajax({
        type: "POST",
        contentType: "application/json; charset=utf-8",
        url: "/PeldonRoseService.asmx/AddTable",
        dataType: "json",
        data: JSON.stringify(Book),
        success: function () {
            $("[id$=booking]").hide('blind', { direction: 'up' }, 2000);
            $("#BookNowBut").delay(2100);
            $("#BookNowBut").show('slide', { direction: 'right' }, 500);
        }
    });
});

测试时,我以英国日期格式dd-MM-yyyy将日期添加到相应的文本框中。但是,我从Chrome的开发人员工具栏收到此错误:



但是,如果我使用美国日期格式MM-dd-yyyy,则一切正常。

问题可能出在我的浏览器的文化信息上吗?

最佳答案

在某个地方,您必须解析日期字符串。请考虑以下两种方法之一:

服务器端解析

  • 完全按照输入的内容传递文本框的内容-您正在执行此操作。
  • 声明bookingDate参数为string而不是DateTime
  • 在方法主体中,使用DateTime.ParseDateTime.ParseExact将字符串转换为DateTime
  • 这样做时,请确保考虑到用户的文化。像"1/4/2014"这样的字符串可能表示1月4日或4月1日。默认情况下,ParseParseExact方法将使用当前区域性。如果您的应用程序中没有其他逻辑可将线程的当前区域性设置为用户区域性,则可以传入特定区域性。如果您不执行任何操作,则可能无法获得预期的行为。

  • 客户端解析
  • 在您的JavaScript代码中,不要仅传递在文本框中输入的内容。而是将字符串解析为Date对象或moment对象(using moment.js)。浏览器的语言和文化设置将影响值的解析方式。
  • 然后将其格式化为ISO-8601格式,例如"2014-04-13"(年,月,日)。
  • 将该字符串传递到您的服务器。
  • 在服务器代码中,可以将参数保留为DateTime,而不必考虑区域性设置。

  • 这是一个使用moment.js进行客户端解析的示例,该示例很容易适合您的代码:

    var date = moment($("#DateComing").val(),"l").format("YYYY-MM-DD");
    

    没有moment.js,那么您可以执行以下操作:

    var dt = new Date($("#DateComing").val());
    
    function zeroPad(n){ return n < 10 ? '0' + n : n; }
    
    var date = dt.getFullYear() + '-' + zeroPad(dt.getMonth()+1) +
                                  '-' + zeroPad(dt.getDate());
    

    (由于您正在收集整个日期和时间,因此我将远离toISOStringtoJSON方法,而改用上述方法之一。)

    10-01 09:20
    查看更多