英国日期格式问题

时间:2014-04-13 14:50:24

标签: 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 (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,一切都很好。

问题可能是我的浏览器的文化信息吗?

2 个答案:

答案 0 :(得分:3)

某处,你必须解析日期字符串。考虑以下两种方法之一:

服务器端解析

  • 完全按照输入的方式传递文本框的内容 - 您当前正在进行此操作。
  • 将您的bookingDate参数声明为string,而不是DateTime
  • 在方法正文中,使用DateTime.ParseDateTime.ParseExact将字符串转换为DateTime
  • 这样做时,请确保考虑用户的文化。像"1/4/2014"这样的字符串可能代表1月4日或4月1日。默认情况下,ParseParseExact方法将使用当前文化。如果您的应用程序中没有其他逻辑将线程的当前文化设置为用户的文化,那么您可以传递特定的文化。如果您既不,那么您可能无法获得预期的行为。

客户端解析

  • 在JavaScript代码中,不要只传递在文本框中输入的内容。而是将该字符串解析为Date对象或moment对象(using 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方法,而是使用上述方法之一。)

答案 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查询将此日期解析为数据库。