英国日期格式问题

本文关键字:问题 格式 日期 英国 | 更新日期: 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.ParseDateTime.ParseExact将字符串转换为DateTime
  • 在进行此操作时,请确保将用户的文化考虑在内。像"1/4/2014"这样的字符串可能表示1月4日或4月1日。默认情况下,ParseParseExact方法将使用当前区域性。如果你的应用程序中没有逻辑将线程的当前文化设置为用户的文化,那么你可以传入特定的文化。如果你既不也不,那么你可能不会得到你期望的行为

客户端解析

  • 在您的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());

(由于您正在收集完整的日期和时间,我将远离toISOStringtoJSON方法,而是使用上面的方法之一。)

使用.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查询将该日期解析到数据库中。