DateTime на дату javascript

98

Из другого ответа на Stackoverflow - это преобразование даты Javascript в .net DateTime:

long msSinceEpoch = 1260402952906; // Value from Date.getTime() in JavaScript
return new DateTime(1970, 1, 1) + new TimeSpan(msSinceEpoch * 10000);

Но как сделать наоборот? DateTime в дату Javascript?

AJ.
источник
В таких вопросах, которые, очевидно, связаны с ajax, вы должны указать, где вы выполняете преобразование, и учитывая, что в JSON нет стандарта для сериализации даты и что возможно, что вы имеете дело с изменением даты MS, например / Date (02020202 ) / не забудьте также прояснить это. удачи
Скай Сандерс
2
Вы должны поставить ссылку на ответ, о котором говорите
cdmckay

Ответы:

116

Пытаться:

return DateTime.Now.Subtract(new DateTime(1970, 1,1)).TotalMilliseconds

Изменить: истинный UTC лучше, но тогда нам нужно быть последовательными

return DateTime.UtcNow
               .Subtract(new DateTime(1970,1,1,0,0,0,DateTimeKind.Utc))
               .TotalMilliseconds;

Хотя, если подумать, это не имеет значения, если обе даты находятся в одном часовом поясе.

Аксель Эккенбергер
источник
5
Возможно, вы захотите использовать DateTime.UtcNow вместо DateTime.Now
Мэтт Диринг,
2
Что касается ваших вторых мыслей: это имеет значение во время перехода на летнее время или из него (мне всегда приходится очень трудно вспомнить, какое :). Во время перехода час с 2:00 до 3:00 повторяется дважды. Это означает, что в течение одного часа дата javascript будет отключена на один час. В UTC нет DLS, поэтому у него нет этой проблемы.
Sebastiaan M
У меня здесь такой же код, но разница в дате javascript составляет 5:30, а дата C # работает нормально.
Жениш Зинзувадия,
44

Конструктор даты JavaScript принимает количество миллисекунд с эпохи Unix (1 января 1970 г., 00:00:00 UTC). Вот метод расширения C #, который преобразует объект .Net DateTime в дату JavaScript:

public static class DateTimeJavaScript
{
   private static readonly long DatetimeMinTimeTicks =
      (new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).Ticks;

   public static long ToJavaScriptMilliseconds(this DateTime dt)
   {
      return (long)((dt.ToUniversalTime().Ticks - DatetimeMinTimeTicks) / 10000);
   }
}

Использование JavaScript:

var dt = new Date(<%= DateTime.Today.ToJavaScriptMilliseconds() %>);
alert(dt);
Яир Невет
источник
Использование C # long date = DateTimeJavaScript.ToJavaScriptMilliseconds (DateTime); проверьте javascript (нажмите F12 в Google Chrome и перейдите в консоль) var date = new Date (long); console.log (date.toString ());
Gonen09
25

Вы можете попробовать это в своем действии:

return DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss");

И это в вашем успехе Ajax:

success: function (resultDateString) {
    var date = new Date(resultDateString);
}

Или это в вашем представлении: (Javascript plus C #)

var date = new Date('@DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss")');
Ренан Серкейра
источник
1
Легко и быстро понять
FindOutIslamNow
лучший ответ для меня
Navid
23

С Moment.js просто используйте:

var jsDate = moment(netDateTime).toDate();

Где netDateTimeсериализована ваша переменная DateTime, например "/Date(1456956000000+0200)/".

Марко Лацкович
источник
11

Это должно помочь:

date.Subtract(new DateTime(1970, 1,1)).TotalMilliseconds
муниссор
источник
4

Я знаю, что это немного поздно, но вот решение, которое мне пришлось придумать для обработки дат, когда вы хотите быть независимым от часового пояса. По сути, это включает в себя преобразование всего в UTC.

С Javascript на сервер :

Отправлять даты как значения эпох без смещения часового пояса.

var d = new Date(2015,0,1) // Jan 1, 2015
// Ajax Request to server ...
$.ajax({
  url: '/target',
  params: { date: d.getTime() - (d.getTimezoneOffset() * 60 * 1000) }
});

Затем сервер получает 1420070400000 в качестве эпохи даты.

На стороне сервера преобразуйте это значение эпохи в объект datetime:

DateTime d = new DateTime(1970, 1, 1, 0, 0, 0).AddMilliseconds(epoch);

На данный момент дата - это просто дата / время, предоставленные пользователем в том виде, в котором они были предоставлены. Фактически это UTC.

Пойдем другим путем :

Когда сервер извлекает данные из базы данных, предположительно в формате UTC, получите разницу в виде эпохи (убедитесь, что оба объекта даты являются локальными или UTC):

long ms = (long)utcDate.Subtract(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds;

или

long ms = (long)localDate.Subtract(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Local)).TotalMilliseconds;

Когда javascript получит это значение, создайте новый объект даты. Однако для этого объекта даты предполагается местное время, поэтому вам необходимо компенсировать его текущим часовым поясом:

var epochValue = 1420070400000 // value pulled from server.
var utcDateVal = new Date(epochValue);
var actualDate = new Date(utcDateVal.getTime() + (utcDateVal.getTimezoneOffset() * 60 * 1000))

console.log(utcDateVal); // Wed Dec 31 2014 19:00:00 GMT-0500 (Eastern Standard Time)
console.log(actualDate); // Thu Jan 01 2015 00:00:00 GMT-0500 (Eastern Standard Time)

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

Код Обезьяна
источник
3

У меня работает этот метод:

   public sCdateToJsDate(cSDate: any): Date {
        // cSDate is '2017-01-24T14:14:55.807'
        var datestr = cSDate.toString();
        var dateAr = datestr.split('-');
        var year = parseInt(dateAr[0]);
        var month = parseInt(dateAr[1])-1;
        var day = parseInt(dateAr[2].substring(0, dateAr[2].indexOf("T")));
        var timestring = dateAr[2].substring(dateAr[2].indexOf("T") + 1);
        var timeAr = timestring.split(":");
        var hour = parseInt(timeAr[0]);
        var min = parseInt(timeAr[1]);
        var sek = parseInt(timeAr[2]);
        var date = new Date(year, month, day, hour, min, sek, 0);
        return date;
    }
Алексей
источник
1

Если вы используете MVC с бритвой

----- Бритва / C #

var dt1 = DateTime.Now.AddDays(14).Date;
    var dt2 = DateTime.Now.AddDays(18).Date;

    var lstDateTime = new List<DateTime>();
    lstDateTime.Add(dt1);
    lstDateTime.Add(dt2);

--- Javascript

$(function() {

            var arr = []; //javascript array

            @foreach (var item in lstDateTime)
             {
                @:arr1.push(new Date(@item.Year, @(item.Month - 1), @item.Day));
             }
  • 1: создайте список на C # и заполните его
  • 2: создать массив в javascript
  • 3. Используйте бритву, чтобы просмотреть список
  • 4: Используйте @: для возврата к js и @ для переключения на C #
  • 5: -1 в месяце, чтобы исправить номер месяца в js.

Удачи

Dinand
источник
0
<input type="hidden" id="CDate" value="<%=DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")%>" />

Чтобы преобразовать дату в дату JS (все числа):

var JSDate = $("#CDate").val();
JSDate = Date.parse(JSDate);
Syaakobi
источник
0

Еще один поздний ответ, но здесь его нет. Если вы хотите обработать преобразование сериализованных /Date(1425408717000)/в javascript, вы можете просто позвонить:

var cSharpDate = "/Date(1425408717000)/"
var jsDate = new Date(parseInt(cSharpDate.replace(/[^0-9 +]/g, '')));

Источник: амирсахиб

Kajbo
источник
Это ответ, но, фу. Не рекомендую. Два взлома не делают правильного. А сериализация Microsoft - отвратительный прием.
Suncat2000
@ Suncat2000 как это хак? Если вы используете службу для получения значения от сервера к интерфейсу, я не знаю лучшей альтернативы. Это самое чистое решение проблемы на этой странице. Если вы знаете лучшую альтернативу, не хотите показать нам пример?
Kajbo