Подтвердить что ты не робот

Дата 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.

4b9b3361

Ответ 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.