DateHeure à date javascript

98

Une autre réponse sur Stackoverflow est une conversion de la date Javascript en .net DateTime:

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

Mais comment faire l'inverse? DateTime à Javascript Date?

UN J.
la source
Dans des questions comme celle-ci qui sont évidemment liées à ajax, vous devez spécifier où vous effectuez la conversion, et considérant qu'il n'y a pas de norme pour la sérialisation de la date dans JSON et qu'il est possible que vous ayez affaire à MS Date munging par exemple / Date (02020202 ) / assurez-vous de le préciser également. bonne chance
Sky Sanders
2
Vous devriez lier la réponse à laquelle vous faites référence
cdmckay

Réponses:

116

Essayer:

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

Edit: le vrai UTC est meilleur, mais nous devons alors être cohérents

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

Bien que, à la réflexion, cela n'a pas d'importance, tant que les deux dates sont dans le même fuseau horaire.

AxelEckenberger
la source
5
Vous voudrez peut-être utiliser DateTime.UtcNow au lieu de DateTime.Now
Matt Dearing
2
En ce qui concerne vos doutes: cela importe pendant la transition vers ou depuis l'heure d'été (je dois toujours réfléchir très fort pour me souvenir de laquelle :). Pendant la transition, l'heure de 2h00 à 3h00 est répétée deux fois. Cela signifie que pendant une heure, la date javascript sera décalée d'une heure. UTC n'a pas de DLS donc il n'a pas ce problème.
Sebastiaan M le
J'ai le même code ici mais cela fait une différence de 5:30 dans la date javascript alors que la date C # fonctionne bien.
Jenish Zinzuvadiya
44

Le constructeur JavaScript Date accepte le nombre de millisecondes depuis l'époque Unix (1er janvier 1970 00:00:00 UTC). Voici la méthode d'extension C # qui convertit l'objet .Net DateTime en date 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);
   }
}

Utilisation de JavaScript:

var dt = new Date(<%= DateTime.Today.ToJavaScriptMilliseconds() %>);
alert(dt);
Yair Nevet
la source
C # usage long date = DateTimeJavaScript.ToJavaScriptMilliseconds (DateTime); check in javascript (appuyez sur F12 dans Google Chrome et accédez à la console) var date = new Date (long); console.log (date.toString ());
Gonen09 le
24

Vous pouvez essayer ceci dans votre action:

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

Et ceci dans votre succès Ajax:

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

Ou ceci dans votre vue: (Javascript plus C #)

var date = new Date('@DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss")');
Renan Cerqueira
la source
1
Facile et rapide à comprendre
FindOutIslamNow
meilleure réponse pour moi
Navid
23

Avec Moment.js, utilisez simplement:

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

netDateTimeest votre variable DateTime sérialisée, quelque chose comme "/Date(1456956000000+0200)/".

Marco Lackovic
la source
11

Cela devrait faire l'affaire:

date.Subtract(new DateTime(1970, 1,1)).TotalMilliseconds
munissor
la source
4

Je sais que c'est un peu tard, mais voici la solution que j'ai dû trouver pour gérer les dates lorsque vous voulez être indépendant du fuseau horaire. Il s'agit essentiellement de tout convertir en UTC.

Du Javascript au serveur :

Envoyez les dates sous forme de valeurs d'époque avec le décalage du fuseau horaire supprimé.

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

Le serveur reçoit alors 1420070400000 comme date.

Du côté du serveur, convertissez cette valeur d'époque en objet datetime:

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

À ce stade, la date est simplement la date / heure fournie par l'utilisateur tel qu'il l'a fournie. En fait, c'est UTC.

Aller dans l'autre sens :

Lorsque le serveur extrait des données de la base de données, probablement en UTC, obtenez la différence sous forme d'époque (en vous assurant que les deux objets de date sont soit locaux, soit UTC):

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

ou

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

Lorsque javascript reçoit cette valeur, créez un nouvel objet de date. Cependant, cet objet de date sera supposé l'heure locale, vous devez donc le décaler par le fuseau horaire actuel:

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)

Pour autant que je sache, cela devrait fonctionner pour tout fuseau horaire où vous devez afficher des dates indépendantes du fuseau horaire.

Singe de code
la source
3

Cette méthode fonctionne pour moi:

   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
la source
1

Si vous utilisez MVC avec un rasoir

----- Rasoir / 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: créez la liste en C # et remplissez-la
  • 2: Créez un tableau en javascript
  • 3: utilisez un rasoir pour parcourir la liste
  • 4: Utilisez @: pour revenir à js et @ pour basculer vers C #
  • 5: Le -1 du mois pour corriger le numéro du mois en js.

Bonne chance

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

Afin de convertir la date en date JS (tous les nombres):

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

Une autre réponse tardive, mais cela manque ici. Si vous souhaitez gérer la conversion de sérialisé /Date(1425408717000)/en javascript, vous pouvez simplement appeler:

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

Source: amirsahib

Kajbo
la source
C'est une réponse mais, Beurk. Je ne le recommande pas. Deux hacks ne font pas un droit. Et la sérialisation de Microsoft est un hack déplaisant.
Suncat2000
@ Suncat2000 comment est ce hack? Si vous utilisez un service pour récupérer de la valeur du serveur au front-end, je ne connais pas de meilleure alternative. C'est la solution la plus propre du problème sur cette page. Si vous connaissez une meilleure alternative, voulez-vous nous montrer l'exemple?
Kajbo