英国日期格式问题
本文关键字:问题 格式 日期 英国 | 更新日期: 2023-09-27 17:58:03
我有一个基于餐厅网络的项目,目前正在进行中,并且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
,一切都会很好。
问题可能是我浏览器的文化信息吗?
在某个地方,您必须解析日期字符串。考虑以下两种方法之一:
服务器端解析
- 完全按照输入的内容传递文本框中的内容,这是您当前正在执行的操作
- 将
bookingDate
参数声明为string
,而不是DateTime
- 在方法体中,使用
DateTime.Parse
或DateTime.ParseExact
将字符串转换为DateTime
- 在进行此操作时,请确保将用户的文化考虑在内。像
"1/4/2014"
这样的字符串可能表示1月4日或4月1日。默认情况下,Parse
和ParseExact
方法将使用当前区域性。如果你的应用程序中没有逻辑将线程的当前文化设置为用户的文化,那么你可以传入特定的文化。如果你既不也不,那么你可能不会得到你期望的行为
客户端解析
- 在您的JavaScript代码中,不要只传递在文本框中输入的内容。相反,将该字符串解析为
Date
对象或moment
对象(使用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());
(由于您正在收集完整的日期和时间,我将远离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]
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查询将该日期解析到数据库中。