首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DataContractJsonSerializer更改我的日期

DataContractJsonSerializer更改我的日期
EN

Stack Overflow用户
提问于 2010-09-01 23:00:32
回答 1查看 1.1K关注 0票数 2

用户在表单中输入日期,但是当我通过AJAX json调用传递日期时,我的日期将被DataContractJsonSerializer更改。

下面是我的AJAX调用:

代码语言:javascript
复制
function Save()
{
    //Convert date to milliseconds from from 1/1/1970 - necessary for passing a date through JSON
    var d = "09/01/2010 05:00";
    myDate = new Date(d);
    myTicks = myDate.getTime();

    var message = 
    {
        MessageID: $("#MessageID").val(),
        MessageDate: '\/Date(' + myTicks + ')\/',
    };

    $.ajax({
        url: "<%= Url.Action("SaveMessage") %>",
        type: "POST",
        dataType: "json",
        data: $.toJSON(message),
        contentType: "application/json; charset=utf-8",
        success: function(result)
        {
            if (result && result.success)
            {
                //
            }
        }
    }); 
}

下面是我的序列化代码:

代码语言:javascript
复制
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    if ((filterContext.HttpContext.Request.ContentType ?? string.Empty).Contains("application/json"))
    {
        var serializer = new DataContractJsonSerializer(RootType);

        filterContext.ActionParameters[Param] = serializer.ReadObject(filterContext.HttpContext.Request.InputStream);
    }
}

把我的日期改成了格林尼治标准时间。因此,如果用户输入"09/01/2010 05:00",那么序列化后的结果是"09/01/2010 09:00“。

我可以使用下面的函数在我的本地环境中修复这个问题,但它在生产环境中不起作用。在我的本地环境中,服务器时间设置为EST (上午11:00)。在生产环境中,服务器时间设置为GMT (下午3:00)。

下面是我的转换函数:

代码语言:javascript
复制
public DateTime ConvertToLocal(DateTime dt)
{
    int hours = TimeZoneInfo.Local.GetUtcOffset(dt).Hours;

    DateTime dtGMT = dt.AddHours(Convert.ToDouble(hours));

    return dtGMT;
}

这会正确地将我的日期从"09/01/2010 09:00 AM“更改回本地环境中的"09/01/2010 05:00 AM”,但在生产环境中它仍然是"09/01/2010 09:00 AM“。

似乎在生产中,DataContractJsonSerializer意识到我是从美国东部时间浏览的,所以它增加了4个小时。但是由于我的生产服务器在格林尼治标准时间,我的ConvertToLocal不工作,该函数中的时区偏移量是0而不是-4。

我能做些什么来解决这个问题呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-09-02 00:47:24

您可能希望使用myTicks = myDate.UTC();而不是myTicks = myDate.getTime();

getTime()使用本地时间(基于运行浏览器的时区)。UTC()也给出了自1970年1月1日以来的毫秒数,但它是1970年1月1日UTC,而不是本地时间。Microsoft的JSON日期序列化使用UTC度量。

这样你就不需要做任何服务器端转换了。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3619451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档