DateTime bis Javascript Datum

98

Aus einer anderen Antwort auf Stackoverflow geht eine Konvertierung von Javascript-Datum zu .net DateTime hervor:

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

Aber wie macht man das Gegenteil? DateTime to Javascript Date?

AJ.
quelle
Bei Fragen wie diesen, die offensichtlich mit Ajax zusammenhängen, sollten Sie angeben, wo Sie die Konvertierung durchführen, und berücksichtigen, dass es in JSON keinen Standard für die Datumsserialisierung gibt und dass es sich möglicherweise um MS Date Munging handelt, z. B. / Date (02020202) ) / Stellen Sie sicher, dass Sie dies auch klarstellen.
Sky Sanders
2
Sie sollten die Antwort, auf die Sie sich beziehen,
verlinken

Antworten:

116

Versuchen:

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

Bearbeiten: wahre UTC ist besser, aber dann müssen wir konsistent sein

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

Obwohl es im zweiten Moment keine Rolle spielt, solange sich beide Daten in derselben Zeitzone befinden.

AxelEckenberger
quelle
5
Vielleicht möchten Sie DateTime.UtcNow anstelle von DateTime.Now
Matt Dearing
2
In Bezug auf Ihre zweiten Gedanken: Es spielt eine Rolle beim Übergang zur oder von der Sommerzeit (ich muss immer sehr viel nachdenken, um mich daran zu erinnern, welche :). Während des Übergangs wird die Stunde von 2:00 bis 3:00 zweimal wiederholt. Dies bedeutet, dass während einer Stunde das Javascript-Datum um eine Stunde verschoben ist. UTC hat kein DLS, daher gibt es dieses Problem nicht.
Sebastiaan M
Ich habe hier den gleichen Code, aber es macht 5:30 Unterschied im Javascript-Datum, während das C # -Datum gut funktioniert.
Jenish Zinzuvadiya
44

Der JavaScript-Datumskonstruktor akzeptiert die Anzahl der Millisekunden seit der Unix-Epoche (1. Januar 1970, 00:00:00 UTC). Hier ist die C # -Erweiterungsmethode, die das .Net DateTime-Objekt in ein JavaScript-Datum konvertiert:

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-Verwendung:

var dt = new Date(<%= DateTime.Today.ToJavaScriptMilliseconds() %>);
alert(dt);
Yair Nevet
quelle
C # use long date = DateTimeJavaScript.ToJavaScriptMilliseconds (DateTime); Javascript einchecken (Drücken Sie in Google Chrome F12 und gehen Sie zur Konsole) var date = new Date (long); console.log (date.toString ());
Gonen09
24

Sie können dies in Ihrer Aktion versuchen:

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

Und das für Ihren Ajax-Erfolg:

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

Oder dies aus Ihrer Sicht: (Javascript plus C #)

var date = new Date('@DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss")');
Renan Cerqueira
quelle
1
Einfach und schnell zu verstehen
FindOutIslamNow
beste Antwort für mich
Navid
23

Verwenden Sie mit Moment.js einfach:

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

Wo netDateTimeist Ihr Datetime - Variable serialisiert, so etwas wie "/Date(1456956000000+0200)/".

Marco Lackovic
quelle
11

Dies sollte den Trick tun:

date.Subtract(new DateTime(1970, 1,1)).TotalMilliseconds
Munissor
quelle
4

Ich weiß, dass dies etwas spät ist, aber hier ist die Lösung, die ich für die Bearbeitung von Daten finden musste, wenn Sie zeitzonenunabhängig sein möchten. Im Wesentlichen geht es darum, alles in UTC zu konvertieren.

Vom Javascript zum Server :

Senden Sie Datumsangaben als Epochenwerte, wobei der Zeitzonenversatz entfernt wurde.

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

Der Server erhält dann 1420070400000 als Datumsepoche.

Konvertieren Sie auf der Serverseite diesen Epochenwert in ein Datum / Uhrzeit-Objekt:

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

Zu diesem Zeitpunkt ist das Datum nur das Datum / die Uhrzeit, die der Benutzer so angegeben hat, wie er es angegeben hat. Tatsächlich ist es UTC.

In die andere Richtung gehen :

Wenn der Server Daten aus der Datenbank abruft, vermutlich in UTC, erhalten Sie den Unterschied als Epoche (stellen Sie sicher, dass beide Datumsobjekte entweder lokal oder UTC sind):

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

oder

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

Wenn Javascript diesen Wert erhält, erstellen Sie ein neues Datumsobjekt. Dieses Datumsobjekt wird jedoch als Ortszeit angenommen, daher müssen Sie es um die aktuelle Zeitzone versetzen:

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)

Soweit ich weiß, sollte dies für jede Zeitzone funktionieren, in der Sie zeitzonenunabhängige Daten anzeigen müssen.

Code Affe
quelle
3

Diese Methode funktioniert bei mir:

   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;
    }
alexey
quelle
1

Wenn Sie MVC mit Rasiermesser verwenden

----- Rasiermesser / 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: Erstellen Sie die Liste in C # und füllen Sie sie aus
  • 2: Erstellen Sie ein Array in Javascript
  • 3: Verwenden Sie Rasiermesser, um die Liste zu iterieren
  • 4: Verwenden Sie @:, um zu js zurückzukehren, und @, um zu C # zu wechseln
  • 5: Die -1 im Monat, um die Monatszahl in js zu korrigieren.

Viel Glück

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

So konvertieren Sie das Datum in das JS-Datum (alle Zahlen):

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

Noch eine späte Antwort, aber diese fehlt hier. Wenn Sie die Konvertierung von serialisiert /Date(1425408717000)/in Javascript durchführen möchten , können Sie einfach anrufen:

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

Quelle: Amirsahib

Kajbo
quelle
Es ist eine Antwort, aber Yuck. Ich empfehle es nicht. Zwei Hacks machen kein Recht. Und die Serialisierung von Microsoft ist ein unangenehmer Hack.
Suncat2000
@ Suncat2000 wie ist dieser Hack? Wenn Sie einen Dienst zum Abrufen von Werten vom Server zum Front-End verwenden, kenne ich keine bessere Alternative. Dies ist die sauberste Lösung des Problems auf dieser Seite. Wenn Sie eine bessere Alternative kennen, möchten Sie uns ein Beispiel zeigen?
Kajbo