英国日期格式问题

4
我正在开发一个基于Web的餐厅项目,目前遇到了与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的开发人员工具栏中收到以下错误消息:

Message: 30-04-2014不是DateTime的有效值。

然而,如果我使用美国日期格式MM-dd-yyyy,一切都可以正常工作。
问题可能是我的浏览器区域信息吗?

1
如果您在浏览器中没有进行任何日期格式化,则浏览器不可能是问题所在。您只需将文本框的内容作为字符串发送到服务器,而服务器会尝试将其转换为“DateTime”值,至少根据我在这个问题中看到的情况是如此。 - user743382
4
可能更容易的方法是改变您的方法签名,将字符串传递给Web方法,在C#代码中使用DateTime.Parse() / DateTime.TryParse()。 - geedubb
使用了建议的.parse函数,完美运行!非常感谢你!! - user3529183
那只是第一步。第二步是使用查询参数。 - Dan Bracuk
1
如果 Parse() 函数对您有用,为什么不将其添加为答案呢? - Sumner Evans
2个回答

3

你需要在某处解析日期字符串。考虑以下两种方法之一:

服务器端解析

  • 传递文本框中输入的内容 - 这是您目前正在执行的操作。
  • 将您的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方法,而是使用上述方法之一。


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 有轻微的更改:

[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 查询将此日期解析到数据库中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接