C# 英国日期格式问题

C# 英国日期格式问题,c#,javascript,datetime,C#,Javascript,Datetime,我有一个基于餐厅网络的项目,目前正在进行,并且在Datetime方面遇到问题 我有一个WebMethod,它将表预订添加到SQL Server数据库中 [WebMethod] public void AddTable(string first, string last, string email, long telephone, int people, string special, DateTime bookingDate) { using (BookingLinqDataContex

我有一个基于餐厅网络的项目,目前正在进行,并且在
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的开发者工具栏收到此错误:

消息:2014年4月30日不是DateTime的有效值

但是,如果我使用美国日期格式
MM-dd-yyyy
一切都很好


问题可能是我的浏览器的区域性信息吗?

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

服务器端解析

  • 按输入的内容传递文本框的内容-您当前正在执行此操作
  • bookingDate
    参数声明为
    string
    而不是
    DateTime
  • 在方法体中,使用
    DateTime.Parse
    DateTime.ParseExact
    将字符串转换为
    DateTime
  • 进行此操作时,请确保您考虑了用户的文化。类似于
    “1/4/2014”
    的字符串可能表示1月4日或4月1日。默认情况下,
    Parse
    ParseExact
    方法将使用当前区域性。如果应用程序中的其他地方没有逻辑将线程的当前区域性设置为用户的区域性,则可以传入特定的区域性。如果你两者都不做,那么你可能不会得到你期望的行为
客户端解析

  • 在JavaScript代码中,不要只传递文本框中输入的内容。相反,将该字符串解析为
    日期
    对象或
    时刻
    对象()。浏览器的语言和区域性设置将影响值的解析方式
  • 然后将其格式化为ISO-8601格式,例如
    “2014-04-13”
    (年、月、日)
  • 将该字符串传递给服务器
  • 在服务器代码中,可以将参数保留为
    DateTime
    ,而不必关心区域性设置
下面是一个客户端解析的示例,它可以轻松地融入到您的代码中:

var date=moment($(“#DateComing”).val(),“l”).format(“YYYY-MM-DD”);
如果没有moment.js,则可以执行以下操作:

var dt=newdate($(“#DateComing”).val();
函数zeroPad(n){返回n<10?'0'+n:n;}
var date=dt.getFullYear()+'-'+zeroPad(dt.getMonth()+1)+
'-'+zeroPad(dt.getDate());

(因为您收集的是一个完整的日期和时间,所以我不会使用
toISOString
toJSON
方法,而是使用上面的方法之一。)

使用.parse函数对我来说很有效

jquery保持不变:

$("#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);
    }
});
}))

但是,webmethod有一个细微的变化:

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


将中的日期作为字符串参数进行解析,然后使用上面的.Parse函数将字符串作为日期进行解析。然后可以使用linq查询将该日期解析到数据库中

如果您没有在浏览器中进行任何类型的日期格式设置,则它不能是浏览器。您只需将文本框的内容作为字符串发送到服务器,服务器会尝试将其转换为
DateTime
值,至少根据我在这个问题中看到的情况。更改方法签名以将字符串传递给webmethod可能更容易,在c#代码中使用DateTime.Parse()/DateTime.TryParse()像建议的那样使用.parse函数,效果非常好!非常感谢你!!这只是第一步。第2步是使用查询参数。@user3529183如果
Parse()
函数对您有效,为什么不添加它作为答案?