2

我有一个 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))"

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

4

3 回答 3

4

我是否可以建议不要在查询字符串中传递类似:“Wed Oct 03 2012 08:00:00 GMT-0400 (Eastern Daylight Time)”之类的内容,而是简单地传递日期的时间戳?例如,new 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"]));

无需解析。

于 2012-10-01T14:54:17.997 回答
3

可能只是您的格式未涵盖该(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);
于 2012-10-01T14:46:57.303 回答
0

我尝试运行代码

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 和(东部夏令时间)部分

于 2012-10-01T14:53:26.810 回答