【问题标题】:Javascript date to C# via Ajax通过 Ajax 将 Javascript 日期转换为 C#
【发布时间】:2010-12-25 01:38:47
【问题描述】:

我有一个 javascript 日期对象,它给了我一个格式为“Wed Dec 16 00:00:00 UTC-0400 2009”的日期字符串。

我通过 Ajax 将它传递给服务器(ASP.NET c#)

如何将“Wed Dec 16 00:00:00 UTC-0400 2009”转换为 C# DateTime 对象。 DateTime.Parse 失败。

【问题讨论】:

    标签: c# javascript date


    【解决方案1】:

    您可以使用DateTime.ParseExact,它允许您指定用于解析的格式字符串:

    DateTime dt = DateTime.ParseExact("Wed Dec 16 00:00:00 UTC-0400 2009",
                                      "ddd MMM d HH:mm:ss UTCzzzzz yyyy",
                                      CultureInfo.InvariantCulture);
    

    【讨论】:

    • 您可能想改用 DateTimeOffset。
    【解决方案2】:

    最可靠的方法是使用自纪元以来的毫秒数。您可以通过调用 Date.getTime() 在 JavaScript 中轻松获取此信息。然后,在 C# 中,您可以将其转换为 DateTime,如下所示:

    long msSinceEpoch = 1260402952906; // Value from Date.getTime() in JavaScript
    return new DateTime(1970, 1, 1).AddTicks(msSinceEpoch * 10000);
    

    您必须乘以 10,000 才能将毫秒转换为“滴答声”,即 100 纳秒。

    【讨论】:

    • 我知道这是一个古老的答案,但我确实有一个问题。添加新的 TimeSpan 而不是调用 DateTime 的 .AddMilliseconds 方法有什么特别的原因吗?
    • 我不记得有什么原因。我现在编辑了使用AddTicks 的答案,这可能比AddMilliseconds 快一点(我们在这里谈论几个CPU 周期)。
    • 我很好奇为什么“纪元”是 1970/01/01。事实证明这是“Unix 时代”。我想我会分享以防其他人好奇或困惑:en.wikipedia.org/wiki/Unix_time
    • 有什么理由不只使用 DateTime.AddMilliseconds? return new DateTime(1970, 1, 1).AddMilliseconds(msSinceEpoch);
    • 注意:JS Date.getTime 返回UTC时间。所以如果你想在 C# 中使用本地时间,你必须使用 ToLocalTime():return new DateTime(1970, 1, 1).AddTicks(msSinceEpoch * 10000).ToLocalTime();
    【解决方案3】:

    在您的情况下这可能是不可能的,但我真的建议更新 JS 代码以传递 ISO 8601 格式的日期/时间。 http://en.wikipedia.org/wiki/ISO_8601

    ISO 8601 不仅是正式标准,而且易于使用,避免了很多时区问题!

    在 Javascript 中获取 8601 个日期时间字符串:

    var d = new Date();
    var iso_time = d.toISOString(); //"2014-05-06T18:49:16.029Z"
    

    在 C# 中读取 8601 日期时间字符串:

    DateTime d = DateTime.Parse(json_string);
    

    【讨论】:

    • 我认为这是最好的方法,因为它是一个步骤,不需要跳过任何其他环节来处理时区或 System.DateTime 解析。
    • 我正在使用这种方法来符合momentjs
    【解决方案4】:

    为了后代,为了帮助未来的谷歌同事,我想扩展 EMP 的答案。

    EMP 的答案以 UTC 为单位提供时间(如果这是您要查找的时间,请使用该时间)。

    在 C# 中到达客户端本地时间

    在 JavaScript 中:

            var now = new Date();
            var UTC = now.getTime();
            var localOffset = (-1) * now.getTimezoneOffset() * 60000;
            var currentTime = Math.round(new Date(UTC + localOffset).getTime()); 
    

    在 C# 中:

            DateTime currentTimeDotNet = new DateTime(1970, 1, 1).AddTicks(Convert.ToInt64(currentTime) * 10000);
    

    感谢this blog 和 EMP 的回答,但在两端都进行了一些试验和错误以使其正确,所以仅供未来的人们参考。

    【讨论】:

    • 这是正确处理时区调整的最正确答案。
    【解决方案5】:

    说实话,我不会尝试在 C# 中解析该日期字符串,我个人会尝试从您的 javascript 日期对象创建一个更有用的日期结构。

    例如,您可以在 javascript 中使用 parse(),它会返回代表日期对象的 ms,您可以使用 DateTime.Parse() on 将其转换为 C# DateTime 对象。

    【讨论】:

      猜你喜欢
      • 2016-12-17
      • 1970-01-01
      • 2013-07-30
      • 1970-01-01
      • 2010-12-18
      • 2021-06-07
      • 1970-01-01
      • 2017-03-08
      • 2018-08-21
      相关资源
      最近更新 更多