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.
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...
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();
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
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);
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);
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 ).
É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.
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.
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);
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();
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();
}
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;
}
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.
J'ai pu résoudre le problème en utilisant la solution indiquée par @Garth.
date.toJSON()
UPDATE: à partir de .NET version 4.6, utilisez plutôt la méthode FromUnixTimeMilliseconds de la structure DateTimeOffset :
DateTimeOffset.FromUnixTimeMilliseconds(1310522400000).DateTime
Newtonsoft.Json.JsonConvert.SerializeObject(Convert.ToDateTime(dr[col.ColumnName])).Replace('"', ' ').Trim();
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();
}