【问题标题】:DateTime.ParseExact format stringDateTime.ParseExact 格式字符串
【发布时间】:2012-10-01 14:38:19
【问题描述】:

我有一个 Web 应用程序,它通过查询字符串将 DateTime 从一个页面传递到另一个页面。它在 IE 和 FireFox 中都运行良好,但每当我在 Google Chrome 中尝试它时都会抛出异常。该程序在以下行阻塞:

startDateTime = Convert.ToDateTime(Request.QueryString["start"]);

于是,我运行调试器,发现查询字符串中的值为:

Wed Oct 03 2012 08:00:00 GMT-0400 (Eastern Daylight Time)

我得出结论,Convert 无法胜任这项工作,并着手尝试让 DateTime.ParseExact 驯服这头野兽。但是,到目前为止,我还没有找到正确的格式字符串。这是我一直在尝试的代码(不起作用):

DateTime.ParseExact(Request.QueryString["start"], "ddd MMM dd yyyy HH:mm:ss zzz", CultureInfo.InvariantCulture);

该页面正在通过第三方组件 (DayPilotCalendar) 调用的一些 JavaScript 从另一个页面调用。这是在 DayPilotCalendar 控件上设置的相关属性:

TimeRangeSelectedJavaScript="GB_showPage('Request Magnet Time', '../../../EventAddEdit.aspx?start=' + encodeURIComponent(start) + '&end=' + encodeURIComponent(end))"

我的格式字符串有什么问题?

【问题讨论】:

  • 您希望结果字符串采用什么格式? IE。 2012 年 9 月 12 日或 2012 年 9 月 12 日等
  • @JordanKaye,结果应该是 DateTime 实例,而不是字符串。所以输出真的不涉及格式。
  • 我正在尝试将其作为 DateTime 取回。
  • 这似乎不是任何标准格式。您可以更改页面的调用者以使用某些标准格式吗?比如ISO 8601例如。
  • 是来自 JS 还是来自 C# 的“Wed Oct 03 2012 08:00:00 GMT-0400 (Eastern Daylight Time)”?

标签: c# .net datetime query-string


【解决方案1】:

我是否可以建议不要在查询字符串中传递诸如“Wed Oct 03 2012 08:00:00 GMT-0400 (Eastern Daylight Time)”之类的内容,而只是传递日期的时间戳?例如,新的 Date().getTime()。 (UTC 自 1970 年以来的毫秒数)。然后,在 C# 中你可以这样做:

var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
var dt =  epoch.AddMilliseconds(Convert.ToInt64(Request.QueryString["start"]));

无需解析。

【讨论】:

    【解决方案2】:

    可能只是您的格式没有涵盖(Eastern Daylight Time) 部分。尝试使用常规字符串处理方法从字符串中解析出来,然后在其余部分调用 ParseExact

    编辑:正如 Oded 指出的那样,您还必须将 GMT 作为文字放入格式字符串中:

    "ddd MMM dd yyyy HH:mm:ss 'GMT'zzz"
    

    以下作品:

    var input = "Wed Oct 03 2012 08:00:00 GMT-0400 (Eastern Daylight Time)";
    var trim = input.Substring(0, input.IndexOf(" ("));
    var dt = DateTime.ParseExact(
        trim,
        "ddd MMM dd yyyy HH:mm:ss 'GMT'zzz",
        CultureInfo.InvariantCulture);
    

    【讨论】:

    • GMT 也会出现问题。
    • 很抱歉拒绝接受您的回答。您的代码有效,但我最终选择了 aquinas 建议的解决方案,因为它似乎更健壮。
    • 嗯,是的,如果你能控制生成字符串的内容,那就更有意义了......
    【解决方案3】:

    我尝试运行代码

    static void Main(string[] args) {
        Console.WriteLine(DateTime.Now.ToString("ddd MMM dd yyyy HH:mm:ss zzz"));            
        Console.Read();
    }
    

    输出是:

    2012 年 10 月 1 日星期一 10:52:20 -04:00

    所以我猜您还需要解析字符串的 GMT 和(东部夏令时间)部分

    【讨论】:

      猜你喜欢
      • 2011-01-01
      • 1970-01-01
      • 2013-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-04
      • 1970-01-01
      • 2010-11-25
      相关资源
      最近更新 更多