DateTime do daty javascript


98

Inną odpowiedzią na Stackoverflow jest konwersja z daty JavaScript na .net DateTime:

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

Ale jak zrobić odwrotnie? DateTime to Javascript Date?


W takich pytaniach, które są oczywiście związane z Ajax, powinieneś określić, gdzie przeprowadzasz konwersję i biorąc pod uwagę, że nie ma standardu serializacji dat w JSON i że jest możliwe, że masz do czynienia z mungingiem MS Date np / Date (02020202 ) / pamiętaj, aby to również było jasne. powodzenia
Sky Sanders

2
Powinieneś połączyć odpowiedź, do której się
odnosisz

Odpowiedzi:


116

Próbować:

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

Edycja: prawdziwe UTC jest lepsze, ale wtedy musimy być konsekwentni

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

Chociaż z drugiej strony nie ma to znaczenia, o ile obie daty są w tej samej strefie czasowej.


5
Możesz użyć DateTime.UtcNow zamiast DateTime.Now
Matt Dearing

2
Jeśli chodzi o Twoje przemyślenia: to ma znaczenie podczas przejścia na czas letni lub z czasu letniego (zawsze muszę naprawdę mocno się zastanowić, żeby to sobie przypomnieć :). Podczas przejścia godzina 2:00 do 3:00 jest powtarzana dwukrotnie. Oznacza to, że w ciągu godziny data javascript będzie przesunięta o godzinę. UTC nie ma DLS, więc nie ma tego problemu.
Sebastiaan M,

Mam tutaj ten sam kod, ale robi to różnicę 5:30 w dacie javascript, podczas gdy data C # działa dobrze.
Jenish Zinzuvadiya,

44

Konstruktor JavaScript Date akceptuje liczbę milisekund od epoki Uniksa (1 stycznia 1970 00:00:00 UTC). Oto metoda rozszerzenia C #, która konwertuje obiekt DateTime .Net na datę 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);
   }
}

Wykorzystanie JavaScript:

var dt = new Date(<%= DateTime.Today.ToJavaScriptMilliseconds() %>);
alert(dt);

C # użycie długiej daty = DateTimeJavaScript.ToJavaScriptMilliseconds (DateTime); sprawdź javascript (wciśnij F12 w Google Chrome i przejdź do konsoli) var date = new Date (long); console.log (date.toString ());
Gonen09

24

Możesz spróbować tego w swojej akcji:

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

I to w Twoim sukcesie Ajax:

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

Lub to w Twoim widoku: (Javascript plus C #)

var date = new Date('@DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss")');

1
Łatwe i szybkie do zrozumienia
FindOutIslamNow

najlepsza odpowiedź dla mnie
Navid

23

W Moment.js po prostu użyj:

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

Gdzie netDateTimejest serializowana zmienna DateTime, na przykład "/Date(1456956000000+0200)/".


11

To powinno załatwić sprawę:

date.Subtract(new DateTime(1970, 1,1)).TotalMilliseconds

4

Wiem, że jest trochę za późno, ale oto rozwiązanie, które musiałem wymyślić, aby zarządzać datami, kiedy chcesz być niezależny od strefy czasowej. Zasadniczo polega na konwersji wszystkiego na UTC.

Od JavaScript do serwera :

Wysyłaj daty jako wartości epok z usuniętym przesunięciem strefy czasowej.

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

Serwer otrzymuje wtedy 1420070400000 jako epokę daty.

Po stronie serwera przekonwertuj tę wartość epoki na obiekt datetime:

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

W tym momencie data jest po prostu datą / godziną podaną przez użytkownika, tak jak ją podał. W rzeczywistości jest to UTC.

Idąc w drugą stronę :

Kiedy serwer pobiera dane z bazy danych, przypuszczalnie w UTC, uzyskaj różnicę jako epokę (upewniając się, że oba obiekty daty są lokalne lub UTC):

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

lub

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

Gdy javascript otrzyma tę wartość, utwórz nowy obiekt daty. Jednak ten obiekt daty zostanie przyjęty jako czas lokalny, więc musisz przesunąć go o aktualną strefę czasową:

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)

O ile wiem, powinno to działać w każdej strefie czasowej, w której musisz wyświetlać daty niezależne od strefy czasowej.


3

Ta metoda działa dla mnie:

   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

Jeśli używasz MVC z maszynką do golenia

----- Brzytwa / 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: utwórz listę w C # i wypełnij ją
  • 2: Utwórz tablicę w javascript
  • 3: Użyj maszynki do golenia, aby powtórzyć listę
  • 4: Użyj @:, aby przełączyć się z powrotem do js i @, aby przełączyć się na C #
  • 5: -1 w miesiącu, aby poprawić numer miesiąca w js.

Powodzenia


0
<input type="hidden" id="CDate" value="<%=DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")%>" />

Aby przekonwertować datę na datę JS (wszystkie liczby):

var JSDate = $("#CDate").val();
JSDate = Date.parse(JSDate);

0

Kolejna późna odpowiedź, ale jej tu brakuje. Jeśli chcesz obsłużyć konwersję serializowanego /Date(1425408717000)/w javascript, możesz po prostu zadzwonić:

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

Źródło: amirsahib


To odpowiedź, ale fuj. Nie polecam tego. Dwa hacki nie dają rady. A serializacja Microsoftu to niesmaczny hack.
Suncat2000

@ Suncat2000 jak to jest hack? Jeśli korzystasz z usługi pobierania wartości z serwera do interfejsu użytkownika, nie znam lepszej alternatywy. To najczystsze rozwiązanie problemu na tej stronie. Jeśli znasz lepszą alternatywę, pokaż nam przykład?
Kajbo
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.