Дата Javascript для С# через Ajax
У меня есть объект даты javascript, который дает мне строку даты в этом формате, "Wed Dec 16 00:00:00 UTC-0400 2009".
Я передаю это через Ajax на сервер (ASP.NET С#)
Как я могу конвертировать "Ср Dec 16 00:00:00 UTC-0400 2009" в объект С# DateTime. Ошибка DateTime.Parse.
Ответы
Ответ 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);
Ответ 2
Самый надежный способ - использовать миллисекунды с эпохи. Вы можете легко получить это в JavaScript, вызвав Date.getTime()
. Затем в С# вы можете преобразовать его в DateTime следующим образом:
long msSinceEpoch = 1260402952906; // Value from Date.getTime() in JavaScript
return new DateTime(1970, 1, 1).AddTicks(msSinceEpoch * 10000);
Вам нужно умножить на 10 000, чтобы конвертировать из миллисекунд в "тики", которые составляют 100 наносекунд.
Ответ 3
Это может быть невозможно в вашем случае, но я действительно рекомендую обновить код JS для передачи дат/времени в формате ISO 8601. http://en.wikipedia.org/wiki/ISO_8601
ISO 8601 - это не только формальный стандарт, он также прост в использовании и предотвращает много хлопот по часовой стрелке!
Чтобы получить 8601 строк даты в Javascript:
var d = new Date();
var iso_time = d.toISOString(); //"2014-05-06T18:49:16.029Z"
Чтобы прочитать 8601 строк даты в С#:
DateTime d = DateTime.Parse(json_string);
Ответ 4
Просто для потомков, чтобы помочь будущим товарищам-гуглерам, я хотел бы расширить ответ EMP.
Ответ EMP предоставляет время в UTC (если это то, что вы ищете, используйте это).
Чтобы найти локальное время клиента в С#:
В JavaScript:
var now = new Date();
var UTC = now.getTime();
var localOffset = (-1) * now.getTimezoneOffset() * 60000;
var currentTime = Math.round(new Date(UTC + localOffset).getTime());
В С#:
DateTime currentTimeDotNet = new DateTime(1970, 1, 1).AddTicks(Convert.ToInt64(currentTime) * 10000);
Кредит этого блога и EMP-ответ, но он принял некоторые пробные и ошибки на обоих концах, чтобы понять это правильно, поэтому просто fyi для будущих людей.
Ответ 5
Если честно, я бы не попытался разобрать эту строку даты в С#, я лично попытаюсь создать более полезную структуру дат из вашего объекта даты javascript.
Например, вы можете использовать parse()
в javascript, который вернет ms, представляющий объект даты, который вы можете использовать DateTime.Parse()
для преобразования в объект С# DateTime.