将Json日期传递给mvc中的操作方法

时间:2015-05-16 20:59:45

标签: json asp.net-mvc asp.net-web-api

以下代码部署到azure:

的javascript:

    var _dp;

    $(function () {
        kendo.culture("en-GB");
        _dp = $("#modified").kendoDatePicker().data("kendoDatePicker");
    });

    function postData() {
        var data = {
            Modified: _dp.value()
        };
        $.ajax({
            type: "POST",
            data: JSON.stringify(data),
            contentType: 'application/json',
            url: "/location/edit",
            success: function (response) {
                log(response.modifedLocalDateTime);
                log(response.modifiedLocalKind);
                log(response.modifiedUtcDateTime);
                log(response.modifiedUtcKind);
            }
        });
    }

    function log(msg) {
        document.getElementById('divLog').innerHTML += "<br/>" + msg;
    }

我的HTML是

<input type="text" id="modified" />

<a href="javascript:postData();">postData</a>

<div id="divLog"></div>

我的mvc控制器是

    [HttpPost]
    public ActionResult Edit(LocationViewModel item)
    {
        var modifiedUtc = item.Modified;
        var modifiedLocal = modifiedUtc.ToLocalTime();

        return Json(new
        {
            modifedLocalDateTime = modifiedLocal.ToString(),
            modifiedLocalKind = modifiedLocal.Kind.ToString(),
            modifiedUtcDateTime = modifiedUtc.ToString(),
            modifiedUtcKind = modifiedUtc.Kind.ToString()
        });
    }

public class LocationViewModel
{
    public int LocationId { get; set; }
    public string Name { get; set; }
    public DateTime Modified { get; set; }
}

还值得指出我的webapi.config:

        config.Formatters.JsonFormatter.SerializerSettings.DateFormatHandling = DateFormatHandling.IsoDateFormat;
        config.Formatters.JsonFormatter.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Utc;

现在我使用剑道日期选择器选择一个日期,例如2015年5月29日,然后点击发布数据。我得到的回报是提前1小时我所要求的。不是我所期待的。我的地区是英国,所以我们在英国的夏季时间是UTC + 1.

所以我期待将日期转换为UTC - 看着小提琴,这似乎是这样:

enter image description here

所以Web api应该以utc格式接收日期。然而,看看输出,web api,于2015年5月28日23:00收到,该类型属性设置为本地?为什么kind属性设置为utc - 我期望的那样,就像在我的webapi.config中我指定了UTC ...那么为什么会这样?

我目前得到的是这个

enter image description here

我想要的是在我的行动方法中收到2015年5月29日而不是2015年5月28日23:00。

我该怎么做?

1 个答案:

答案 0 :(得分:0)

您将Zulu time zone(即UTC)传递给服务器,没有任何偏移。服务器正在将其转换为自己的时区。所以你可以用两种方式解决问题:

  • 更正客户端,以便将正确的偏移量发送到服务器
  • 从客户端发送没有偏移的日期,以便它不会对其进行任何更改

对于第二个选项,您可以使用ISO格式,如下所示:

2015-05-17T13:32:00 // YYYY-MM-DD hh:mm:ss.ddddd

此格式始终按预期解释,并且由于未指定时区,因此日期将保留在服务器中。

您可以使用moment.js来操作日期,然后再将它们发送回服务器。