2012-10-01 3 views
2

У меня есть веб-приложение, которое передает DateTime с одной страницы на другую с помощью строки запроса. Он отлично работал как в IE, так и в FireFox, но бросал исключения, когда я пробовал это в Google Chrome. Программа удушья на следующей строке:DateTime.ParseExact string string

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

Итак, я побежал отладчик и обнаружил, что значение в строке запроса является:

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

Я пришел к выводу, что Преобразовать просто не до задание и попытаться получить DateTime.ParseExact для приручения этого зверя. Но до сих пор правильная строка формата ускользала от меня. Вот код, который я пытался (который не работает):

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

Эта страница вызывается из другой страницы через некоторое JavaScript, который называется компонентом третьей стороной (DayPilotCalendar). Вот соответствующее свойство, которое устанавливается на контроле DayPilotCalendar:

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

Что не так с моей строки формата?

+1

В каком формате вам нужна строка результатов? то есть. 09/12/2012 или 12 сентября 2012 г. и т. Д. –

+2

@JordanKaye, результатом должен быть экземпляр DateTime, а не строка. Таким образом, на выходе нет никакого формата. –

+0

Я пытаюсь вернуть его как DateTime. – Matt

ответ

4

Я мог бы предложить что вместо того, чтобы передавать что-то вроде: «Wed Oct 03 2012 08:00:00 GMT-0400 (Eastern Daylight Time)» в вашей строке запроса, вместо этого вы просто передаете метку даты? Например, новая дата(). GetTime(). (Число миллисекунд с 1970 года в UTC). Затем, в C#, вы можете просто:

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

Отсутствует необходимость в анализе.

3

Возможно, ваш формат не охватывает раздел (Eastern Daylight Time). Попробуйте разобрать это из своей строки, используя обычные методы обработки строк, затем нажимая ParseExact на оставшуюся часть.

Edit: Как Одед указывает, вы также должны поставить 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); 
+4

'GMT' также даст проблемы. – Oded

+0

@Oded: Хорошая точка. – Rawling

+0

Извините, что reneg согласился с вашим ответом. Ваш код работает, но я решил пойти с решением, предложенным aquinas, так как кажется, что он, вероятно, будет более надежным. – Matt

0

Я попытался запустить код

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

Выход:

пн 1 октября 2012 10:52:20 -04: 00

Так что я думаю, что вам нужно разобрать GMT и (по восточному поясному времени) часть строки, а

Смежные вопросы