web-dev-qa-db-fra.com

Comment convertir une date/heure Javascript à une date C #?

Je lisais que si vous voulez convertir des dates JavaScript en dates C #, vous devez utiliser getTime(), puis ajouter ce résultat à une variable C # DateTime.

Supposons que j'ai ce temps JavaScript:

Date {Tue Jul 12 2011 16:00:00 GMT-0700 (Pacific Daylight Time)}

Il rend à 1310522400000 millisecondes

var a = new DateTime(1970, 01, 01).AddMilliseconds(1310522400000);

// result
7/13/2011 2:00:00 AM

Donc c'est faux. Je ne suis pas sûr de ce que je dois faire.

36
chobo2

Commencez par créer une chaîne au format requis à l'aide des fonctions suivantes en JavaScript.

var date = new Date();
var day = date.getDate();       // yields date
var month = date.getMonth() + 1;    // yields month (add one as '.getMonth()' is zero indexed)
var year = date.getFullYear();  // yields year
var hour = date.getHours();     // yields hours 
var minute = date.getMinutes(); // yields minutes
var second = date.getSeconds(); // yields seconds

// After this construct a string with the above results as below
var time = day + "/" + month + "/" + year + " " + hour + ':' + minute + ':' + second; 

Passez cette chaîne à la fonction codebehind et acceptez-la en tant que paramètre de chaîne. Utilisez la fonction DateTime.ParseExact() dans codebehind pour convertir cette chaîne en DateTime comme suit

DateTime.ParseExact(YourString, "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture);

J'espère que cela t'aides...

25
Harun

Vous aviez presque raison, il vous faut juste une petite solution:

var a = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)
    .AddMilliseconds(1310522400000)
    .ToLocalTime();
22
vasiliy

Vous pouvez utiliser la méthode toJSON () JavaScript qui convertit un DateTime JavaScript en ce que C # peut reconnaître en tant que DateTime. 

Le code JavaScript ressemble à ceci

var date = new Date();
date.toJSON(); // this is the JavaScript date as a c# DateTime
17
Garth

DateTime.Parse est un bien meilleur pari. Les dates JS et C # ne partent pas de la même racine.

Échantillon:

DateTime dt = DateTime.ParseExact("Tue Jul 12 2011 16:00:00 GMT-0700",
                                  "ddd MMM d yyyy HH:mm:ss tt zzz",
                                  CultureInfo.InvariantCulture);
5
Mrchief

Si vous utilisez moment.js dans votre application. 

var x = moment (nouveau format Date ()). ('JJ/MM/AAAA hh: mm: ss') 

Passez x à la fonction codebehind et acceptez-la en tant que paramètre de chaîne. Utilisez la DateTime.ParseExact() en c # pour convertir cette chaîne en DateTime comme suit,

DateTime.ParseExact(YourString, "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture);
3
raga

Si vous souhaitez envoyer des dates à C # à partir de JS, c’est en fait assez simple - si l’envoi de dates UTC est acceptable.

var date = new Date("Tue Jul 12 2011 16:00:00 GMT-0700");
var dateStrToSendToServer = date.toISOString();

... envoyer au côté C # ...

var success = DateTimeOffset.TryParse(jsISOStr, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out var result);

C # DateTime comprend déjà les formats de date ISO et l’analysera parfaitement.

Pour formater de C # à JS, utilisez simplement DateTime.UtcNow.ToString("o").

Personnellement, je ne suis jamais à l'aise en m'appuyant sur les mathématiques et la logique entre différents environnements pour que les millisecondes/ticks affichent la même date et l'heure exactes qu'un utilisateur peut voir sur le client (en particulier lorsque cela importe). Je ferais de même lors du transfert de devise (utilisez plutôt des chaînes pour vous protéger, ou séparez dollars et cents entre deux entiers différents). Envoyer la date/heure sous forme de valeurs séparées serait simplement un bien (voir réponse acceptée ).

3
James Wilkins

Étant donné que je suis dans un fuseau horaire différent, mon JavaScript et C # finissent par avoir une différence de 2 heures entre la même date (même lorsque j'ai essayé d'envoyer la date à un service Web sous forme de date [non convertie en chaîne/autre objet]).

J'ai essayé d'utiliser getTime () en JavaScript et d'ajouter les millisecondes à une date C # (à partir du 1970-01-01), mais je me suis toujours retrouvé avec deux heures d'avance sur ma date C #.

Pour accepter que j'obtienne la même date et l'heure des deux côtés, j'ai fini par faire ceci:

En JavaScript, j'ai utilisé la fonction UTC:

var jsDate = Date.UTC(year,month,day,hours,minutes,seconds,millisec);

Et en C # pour obtenir le bon DateTime, j'ai fait ceci:

var date = new DateTime(1970, 1, 1, 0, 0, 0, 0).AddMilliseconds(jsDate);

J'espère que ça aide quelqu'un.

3
Rafael Merlin

Si vous vous trouvez dans le fuseau horaire américain du Pacifique, l’époque est pour vous à 16 heures. le 31 décembre 1969. Vous avez ajouté les millisecondes depuis l’époque à 

new DateTime(1970, 01, 01)

qui, n'ayant pas de fuseau horaire, a été interprété comme étant dans votre fuseau horaire.

Il n’ya rien de vraiment faux de penser aux instants dans le temps en millisecondes depuis l’époque, mais comprenez que l’époque n’est que 1970-01-01T00: 00: 00Z.

Vous ne pouvez pas penser à des instants dans des moments, lorsqu'ils sont représentés sous forme de dates, sans fuseaux horaires.

1
Ray Toal

Vous pouvez également envoyer du temps Js en C # avec la bibliothèque Moment.js:

JavaScript: var dateString = moment(new Date()).format('LLLL')

C #: DateTime.Parse(dateString);

0
AminSojoudi

JS:

 function createDateObj(date) {
            var day = date.getDate();           // yields 
            var month = date.getMonth();    // yields month
            var year = date.getFullYear();      // yields year
            var hour = date.getHours();         // yields hours 
            var minute = date.getMinutes();     // yields minutes
            var second = date.getSeconds();     // yields seconds
            var millisec = date.getMilliseconds();
            var jsDate = Date.UTC(year, month, day, hour, minute, second, millisec);
            return jsDate;
        }

JS:

var oRequirementEval = new Object();
var date = new Date($("#dueDate").val());

CS:

requirementEvaluations.DeadLine = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)
    .AddMilliseconds(Convert.ToDouble( arrayUpdateRequirementEvaluationData["DeadLine"]))
    .ToLocalTime();
0
Jaydeep Shil

JavaScript (HTML5)

function TimeHelper_GetDateAndFormat() {
    var date = new Date();

    return MakeValid(date.getDate()).concat(
        HtmlConstants_FRONT_SLASH,
        MakeValid(date.getMonth() + 1),
        HtmlConstants_FRONT_SLASH,
        MakeValid(date.getFullYear()),
        HtmlConstants_SPACE,
        MakeValid(date.getHours()),
        HtmlConstants_COLON,
        MakeValid(date.getMinutes()),
        HtmlConstants_COLON,
        MakeValid(date.getSeconds()));
}

function MakeValid(timeRegion) {
    return timeRegion !== undefined && timeRegion < 10 ? ("0" + timeRegion).toString() : timeRegion.toString();
}

C #

private const string DATE_FORMAT = "dd/MM/yyyy HH:mm:ss";

public DateTime? JavaScriptDateParse(string dateString)
{
    DateTime date;
    return DateTime.TryParseExact(dateString, DATE_FORMAT, CultureInfo.InvariantCulture, DateTimeStyles.None, out date) ? date : null;
}
0
MyKuLLSKI

Il y a eu quelques erreurs dans la réponse de harun qui sont corrigées ci-dessous:

1) la date où harun a utilisé getDay() qui est incorrect devrait être getDate()

2) getMonth() donne un mois de moins que le mois réel, nous devrions donc l’augmenter de 1 comme indiqué ci-dessous

var date = new Date();
var day = date.getDate();           // yields 
var month = date.getMonth() + 1;    // yields month
var year = date.getFullYear();      // yields year
var hour = date.getHours();         // yields hours 
var minute = date.getMinutes();     // yields minutes
var second = date.getSeconds();     // yields seconds

// After this construct a string with the above results as below
var time = day + "/" + month + "/" + year + " " + hour + ':' + minute + ':' + second; 

Passez cette chaîne à la fonction codebehind et acceptez-la en tant que paramètre de chaîne. Utilisez la fonction DateTime.ParseExact() dans codebehind pour convertir cette chaîne en DateTime comme suit

DateTime.ParseExact(YourString, "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture);

Cela a fonctionné pour moi! Espérons que cela vous aide aussi.

0
Rohit Arora

J'ai pu résoudre le problème en utilisant la solution indiquée par @Garth.

date.toJSON()
0
Juan Martí

UPDATE: à partir de .NET version 4.6, utilisez plutôt la méthode FromUnixTimeMilliseconds de la structure DateTimeOffset

DateTimeOffset.FromUnixTimeMilliseconds(1310522400000).DateTime
0
Andriy Tolstoy
Newtonsoft.Json.JsonConvert.SerializeObject(Convert.ToDateTime(dr[col.ColumnName])).Replace('"', ' ').Trim();
0
Sayed Azharuddin

Je pense que vous pouvez utiliser le TimeZoneInfo .... pour convertir le date/heure ....

    static void Main(string[] args)
    {
        long time = 1310522400000;
        DateTime dt_1970 = new DateTime(1970, 1, 1);
        long tricks_1970 = dt_1970.Ticks;
        long time_tricks = tricks_1970 + time * 10000;
        DateTime dt = new DateTime(time_tricks);

        Console.WriteLine(dt.ToShortDateString()); // result : 7/13
        dt = TimeZoneInfo.ConvertTimeToUtc(dt);

        Console.WriteLine(dt.ToShortDateString());  // result : 7/12
        Console.Read();
    }
0
shenhengbin