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 to Javascript Date?


У таких питаннях, які, очевидно, пов'язані з ajax, ви повинні вказати, де ви робите конверсію, і, враховуючи, що в JSON не існує стандарту серіалізації дати і, можливо, ви маєте справу з переключенням дат MS, наприклад / дата (02020202 ) / не забудьте зробити це також зрозумілим. удачі
Sky Sanders

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
Matt Dearing

2
Щодо ваших другої думки: це не має значення під час переходу на літній час або з нього (завжди мені потрібно думати, що важко згадати, який :). Під час переходу годину 2:00 до 3:00 повторюють двічі. Це означає, що протягом однієї години дата JavaScript буде відключена на одну годину. UTC не має DLS, тому у нього немає такої проблеми.
Себастьян М

У мене є той самий код, але він робить різницю в 5:30 у даті JavaScript, тоді як дата 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 (довгий); console.log (date.toString ());
Gonen09

24

Ви можете спробувати це у своїй дії:

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

І це у вашому успіху Ajax:

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

Або це у вашому представленні: (Javascript плюс 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)/".



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 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.

Удачі


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);

0

Ще одна пізня відповідь, але цього тут немає. Якщо ви хочете обробити перетворення серіалізованих /Date(1425408717000)/у javascript, ви можете просто зателефонувати:

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

Джерело: amirsahib


Це відповідь, але, Юк. Я не рекомендую. Два хаки не роблять права. А серіалізація Microsoft - це неприємний злом.
Suncat2000

@ Suncat2000 як це зламати? Якщо ви використовуєте сервіс для отримання значень з сервера на передній, я не знаю кращої альтернативи. Це найчистіше рішення проблеми на цій сторінці. Якщо ви знаєте кращу альтернативу, хочете показати нам приклад?
Кайбо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.