Как конвертировать Javascript datetime в C # datetime? - PullRequest
46 голосов
/ 15 июля 2011

Я читал, что если вы хотите преобразовать даты JavaScript в даты C #, вы должны использовать getTime(), а затем добавить этот результат в C # DateTime.

Предположим, у меня есть время JavaScript:

Date {Tue Jul 12 2011 16:00:00 GMT-0700 (Pacific Daylight Time)}

Отображается до 1310522400000 миллисекунд

var a = new DateTime(1970, 01, 01).AddMilliseconds(1310522400000);

// result
7/13/2011 2:00:00 AM

Так что это неправильно.Я не уверен, что мне нужно делать.

Ответы [ 16 ]

32 голосов
/ 01 марта 2018

Вы можете использовать метод JavaScript toJSON () , он преобразует JavaScript DateTime в то, что C # может распознать как DateTime.

Код JavaScript выглядит следующим образом

var date = new Date();
date.toJSON(); // this is the JavaScript date as a c# DateTime
28 голосов
/ 15 июля 2011

Сначала создайте строку в требуемом формате, используя следующие функции в JavaScript

var date = new Date();
var day = date.getDate();       // yields date
var month = date.getMonth() + 1;    // yields month (add one as '.getMonth()' is zero indexed)
var year = date.getFullYear();  // yields year
var hour = date.getHours();     // yields hours 
var minute = date.getMinutes(); // yields minutes
var second = date.getSeconds(); // yields seconds

// After this construct a string with the above results as below
var time = day + "/" + month + "/" + year + " " + hour + ':' + minute + ':' + second; 

Передайте эту строку функции codebehind и примите ее как строковый параметр. Используйте DateTime.ParseExact() в codebehind для преобразования этой строки в DateTime следующим образом:

DateTime.ParseExact(YourString, "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture);

Надеюсь, это поможет ...

26 голосов
/ 10 декабря 2013

Вы были почти правы, нужно сделать только одно маленькое исправление:

var a = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)
    .AddMilliseconds(1310522400000)
    .ToLocalTime();
6 голосов
/ 15 июля 2011

DateTime.Parse - намного лучшая ставка.Даты JS и C # не начинаются с одного корня.

Пример:

DateTime dt = DateTime.ParseExact("Tue Jul 12 2011 16:00:00 GMT-0700",
                                  "ddd MMM d yyyy HH:mm:ss tt zzz",
                                  CultureInfo.InvariantCulture);
4 голосов
/ 06 февраля 2018

Если вы хотите отправить даты на C # из JS, это на самом деле довольно просто - если отправка дат по UTC приемлема.

var date = new Date("Tue Jul 12 2011 16:00:00 GMT-0700");
var dateStrToSendToServer = date.toISOString();

... отправить на сторону C # ...

var success = DateTimeOffset.TryParse(jsISOStr, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out var result);

C # DateTime уже понимает форматы даты ISO и будет разбирать его очень хорошо.

Для форматирования из C # в JS просто используйте DateTime.UtcNow.ToString("o").

Лично я никогдаудобно полагаться на математику и логику между различными средами, чтобы миллисекунды / тики отображали ТОЧНУЮ дату и время, которые пользователь может видеть на клиенте (особенно там, где это важно).Я бы сделал то же самое при переводе валюты (вместо этого используйте строки, чтобы быть в безопасности, или разделите доллары и центы между двумя разными целыми числами).Отправка даты / времени в виде отдельных значений была бы просто хорошей идеей (см. принятый ответ ).

4 голосов
/ 12 июня 2017

Если вы используете moment.js в вашем приложении.

var x = момент (новая дата ()). Формат ('ДД / ММ / ГГГГ чч: мм: сс')

Передайте x в функцию codebehind и примите ее какстроковый параметр.Используйте DateTime.ParseExact() в c # для преобразования этой строки в DateTime следующим образом:

DateTime.ParseExact(YourString, "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture);
4 голосов
/ 12 февраля 2014

Так как я нахожусь в другом часовом поясе, мои JavaScript и C # имеют разницу в 2 часа между одной и той же датой (даже когда я пытался отправить дату в веб-сервис как дату [не преобразована в строку / другой объект] ).

Я пытался использовать getTime () в JavaScript и добавлять миллисекунды к дате C # (начиная с 1970-01-01), но у меня всегда было два часа вперед на моей дате C #.

Чтобы дать мне одинаковую дату и час с обеих сторон, я в итоге сделал это:

В JavaScript я использовал функцию UTC:

var jsDate = Date.UTC(year,month,day,hours,minutes,seconds,millisec);

И в C # для получения правильного DateTime я сделал это:

var date = new DateTime(1970, 1, 1, 0, 0, 0, 0).AddMilliseconds(jsDate);

Надеюсь, это кому-нибудь поможет.

1 голос
/ 15 июля 2011

Если вы находитесь в часовом поясе США в Тихом океане, то для вас эпоха - 4 часа дня. 31 декабря 1969 года. Вы добавили миллисекунды с эпохи к

new DateTime(1970, 01, 01)

, который, поскольку у него не было часового пояса, интерпретировался как находящийся в вашем часовом поясе.

Нет ничего плохого в том, чтобы думать о моментах во времени как о миллисекундах с эпохи, но поймите, что эпоха только 1970-01-01T00: 00: 00Z.

Вы не можете думать о моментах времени, когда они представлены как даты, без часовых поясов.

0 голосов
/ 29 января 2019
Newtonsoft.Json.JsonConvert.SerializeObject(Convert.ToDateTime(dr[col.ColumnName])).Replace('"', ' ').Trim();
0 голосов
/ 01 июня 2018

Мне удалось решить проблему, используя решение, указанное @ Garth.

date.toJSON()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...