我目前正在处理一个基于餐厅网络的项目,但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.Parse
或DateTime.ParseExact
将字符串转换为DateTime
。 "1/4/2014"
这样的字符串可能表示1月4日或4月1日。默认情况下,Parse
和ParseExact
方法将使用当前区域性。如果您的应用程序中没有其他逻辑可将线程的当前区域性设置为用户区域性,则可以传入特定区域性。如果您不执行任何操作,则可能无法获得预期的行为。 客户端解析
Date
对象或moment
对象(using moment.js)。浏览器的语言和文化设置将影响值的解析方式。 "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());
(由于您正在收集整个日期和时间,因此我将远离
toISOString
或toJSON
方法,而改用上述方法之一。)