我有一个基于网络的餐厅项目,我目前正在处理这个项目,我遇到了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的开发人员工具栏收到此错误:
消息:30-04-2014不是DateTime的有效值。
但是,如果我使用美国日期格式MM-dd-yyyy
,一切都很好。
问题可能是我的浏览器的文化信息吗?
答案 0 :(得分:3)
某处,你必须解析日期字符串。考虑以下两种方法之一:
服务器端解析
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
方法,而是使用上述方法之一。)
答案 1 :(得分:0)
使用.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]
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查询将此日期解析为数据库。