DateTime alla data javascript


98

Da un'altra risposta su Stackoverflow è una conversione da data Javascript a .net DateTime:

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

Ma come fare il contrario? DateTime alla data Javascript?


In domande come questa che sono ovviamente correlate ad ajax, dovresti specificare dove stai facendo la conversione e considerando che non esiste uno standard per la serializzazione della data in JSON e che è possibile che tu abbia a che fare con MS Date munging ad esempio / Date (02020202 ) / assicurati di chiarire anche questo. buona fortuna
Sky Sanders

2
Dovresti collegare la risposta a cui ti riferisci
cdmckay

Risposte:


116

Provare:

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

Modifica: il vero UTC è migliore, ma poi dobbiamo essere coerenti

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

Anche se, a pensarci bene, non importa, purché entrambe le date siano nello stesso fuso orario.


5
Potresti voler usare DateTime.UtcNow invece di DateTime.Now
Matt Dearing

2
Per quanto riguarda i tuoi ripensamenti: importa durante il passaggio da o verso l'ora legale (devo sempre pensare molto per ricordare quale :). Durante la transizione l'ora dalle 2:00 alle 3:00 viene ripetuta due volte. Ciò significa che durante un'ora la data di javascript sarà disattivata di un'ora. UTC non ha DLS quindi non ha questo problema.
Sebastiaan M

Ho lo stesso codice qui ma fa la differenza 5:30 nella data di javascript mentre la data C # funziona bene.
Jenish Zinzuvadiya

44

Il costruttore JavaScript Date accetta il numero di millisecondi dall'epoca Unix (1 gennaio 1970 00:00:00 UTC). Ecco il metodo di estensione C # che converte l'oggetto .Net DateTime in data 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);
   }
}

Utilizzo di JavaScript:

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

Data lunga di utilizzo C # = DateTimeJavaScript.ToJavaScriptMilliseconds (DateTime); controlla in javascript (premi F12 in Google Chrome e vai alla console) var date = new Date (long); console.log (date.toString ());
Gonen09

24

Puoi provare questo nella tua azione:

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

E questo nel tuo successo con l'Ajax:

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

O questo nella tua vista: (Javascript più C #)

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

1
Facile e veloce da capire
FindOutIslamNow

migliore risposta per me
Navid

23

Con Moment.js usa semplicemente:

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

Dov'è netDateTimeserializzata la tua variabile DateTime, qualcosa di simile "/Date(1456956000000+0200)/".


11

Questo dovrebbe fare il trucco:

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

4

So che è un po 'tardi, ma ecco la soluzione che ho dovuto trovare per gestire le date quando vuoi essere indipendente dal fuso orario. Essenzialmente si tratta di convertire tutto in UTC.

Da Javascript al server :

Invia le date come valori di epoca con la differenza di fuso orario rimossa.

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

Il server quindi riceve 1420070400000 come data epoch.

Sul lato Server, converti quel valore epoch in un oggetto datetime:

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

A questo punto la data è solo la data / ora fornita dall'utente così come l'ha fornita. Effettivamente è UTC.

Andando dall'altra parte :

Quando il server estrae i dati dal database, presumibilmente in UTC, ottieni la differenza come epoca (assicurandoti che entrambi gli oggetti data siano locali o UTC):

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

o

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

Quando javascript riceve questo valore, crea un nuovo oggetto data. Tuttavia, questo oggetto data verrà assunto come ora locale, quindi è necessario compensarlo con il fuso orario corrente:

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)

Per quanto ne so, questo dovrebbe funzionare per qualsiasi fuso orario in cui è necessario visualizzare date indipendenti dal fuso orario.


3

Questo metodo funziona per me:

   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

Se usi MVC con il rasoio

----- Rasoio / 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: crea l'elenco in C # e riempilo
  • 2: crea un array in javascript
  • 3: Usa il rasoio per scorrere l'elenco
  • 4: Usa @: per tornare a js e @ per passare a C #
  • 5: -1 nel mese per correggere il numero del mese in js.

In bocca al lupo


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

Per convertire la data in data JS (tutti i numeri):

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

0

Un'altra risposta tardiva, ma qui manca. Se vuoi gestire la conversione di serializzato /Date(1425408717000)/in javascript, puoi semplicemente chiamare:

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

Fonte: amirsahib


È una risposta ma, Yuck. Non lo consiglio. Due hack non fanno un diritto. E la serializzazione di Microsoft è un trucco sgradevole.
Suncat2000,

@ Suncat2000 come è questo hack? Se stai usando un servizio per recuperare valore dal server al front-end, non conosco alternativa migliore. Questa è la soluzione più pulita del problema in questa pagina. Se conosci un'alternativa migliore, ti va di mostrarci l'esempio?
Kajbo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.