【问题标题】:Is there a standard date/time format that can be passed on a URL?是否有可以在 URL 上传递的标准日期/时间格式?
【发布时间】:2010-02-26 21:36:48
【问题描述】:

查看DateTimeFormatInfo 文档,似乎所有标准格式都包含冒号,这使得在 url 上传递它们令人不快/不可能。

是否有在 url 上传递日期时间的标准化格式,最好是可以由 .NET 自动解析的格式?


更新:一点说明

此数据的使用者将是某种 Web 服务 - 它可能是一个简单的 HTTP GET,在查询字符串中具有此值,或者是 REST,其值在某处的 url 中。

ISO 8601 控制日期/时间格式,根据 wiki 文章,使用 ToString("yyyyMMddTHHmmssZ") 至少应该符合标准。不幸的是,它不会被 ASP.NET MVC 自动拾取(还没有尝试过其他任何东西)。无论如何,ASP.NET MVC 也不会自动将刻度转换为日期时间,这让我很惊讶。

【问题讨论】:

    标签: .net datetime url


    【解决方案1】:

    我会将所有内容放在一个答案中:

    你可以这样做:

            string urlSafeDateString = HttpServerUtility.UrlTokenEncode(date.ToUniversalTime().ToString(System.Globalization.CultureInfo.InvariantCulture).ToCharArray());
    
            DateTime date = DateTime.Parse(new string(HttpServerUtility.UrlTokenDecode(urlSafeDateString)), System.Globalization.CultureInfo.InvariantCulture).ToLocalTime();
    

    或者你可以这样做:

            string urlSafeDateString = date.ToUniversalTime().ToString("yyyyMMddTHHmmss", System.Globalization.CultureInfo.InvariantCulture);
    
            DateTime date = DateTime.ParseExact(urlSafeDateString, "yyyyMMddTHHmmss", System.Globalization.CultureInfo.InvariantCulture).ToLocalTime();
    

    【讨论】:

    • 这与我现在使用的非常接近。
    【解决方案2】:

    是的。 ISO 8601

    http://en.wikipedia.org/wiki/ISO_8601

    只需确保您对其进行 URLEncode 处理以处理冒号。

    【讨论】:

    • 当我使用 UrlEncode 时,我得到一个 HTTP 400 BAD REQUEST,如果我这样做两次。
    【解决方案3】:

    它可能不是任何标准或类似内容的一部分,但您始终可以使用Unix timestamp,因为它们只包含数字。有关将其转换为 .NET DateTime 的方法,请参阅 this article

    【讨论】:

      【解决方案4】:

      我们实际上有一个报告解决方案,其中日期和时间可以作为纯文本 CCYYMMDDhhmmss 值传递,然后,当代码需要对这些值执行任何操作时,它只需使用字符串操作将它们返回转换成可以显示或易于解析的格式(例如 DB2 ISO 格式 CCYY-MM-DD 或 hh.mm.ss)。

      结果是可读的,如果 .NET 没有可以轻松执行此操作的字符串操作指令,我会感到惊讶。

      【讨论】:

        【解决方案5】:

        【讨论】:

        • 静态类是HttpUtility,应该是HttpUtility.UrlEncode,而不是url的html编码...
        【解决方案6】:

        不管怎样,ASP.NET MVC 也不会自动将刻度转换为日期时间,这让我很吃惊。

        有一个 DateTime 的构造函数,它采用刻度数:

         DateTime d = new DateTime(634028202671420663);
        

        还有一个覆盖可以让您将其映射到本地时间或 UTC 时间。这一切都在文档中:http://msdn.microsoft.com/en-us/library/system.datetime.datetime.aspx

        编辑:从帖子的措辞中意识到,也许您正在谈论 ASP 将刻度自动转换为 DateTime,而不是必须读取数字参数。也许! :-)

        【讨论】:

        • 是的,我希望找到一种可以自动工作的格式(用于模型绑定)
        【解决方案7】:

        如果您需要日期和时间,我会使用DateTime.Ticks

        如果您只需要日期,请使用HttpServerUtility.UrlEncode(date.ToShortDateString())

        更新:Rick Strahl 之前曾讨论过这个问题,并在 his blog 上提供了解决方案。

        【讨论】:

        • 确保使用 InvariantCulture(在客户端和服务器上),否则对于不同的用户,这将随机工作/失败!
        【解决方案8】:

        我刚刚遇到了同样的问题,并使用以下辅助方法解决了它:

            private string Encode(DateTime date)
            {
                var formattedDate = date.ToString("yyyy-MM-ddTHH:mm:ss", System.Globalization.CultureInfo.InvariantCulture);
                return WebUtility.UrlEncode(formattedDate);
            }
        

        在 URL 查询参数中使用输出后,该值被 .NET 正确反序列化为传递给我的 Web API 服务的 DateTime 对象。

        【讨论】:

          猜你喜欢
          • 2012-08-23
          • 2023-01-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-15
          • 1970-01-01
          • 1970-01-01
          • 2019-04-30
          相关资源
          最近更新 更多