2010-11-04 6 views
0

Asp.Net MVC 2 Futures ne semble pas bien gérer JSON DateTime (y compris les valeurs doubles et décimales). En tant que tel, j'ai configuré toutes les entrées en tant que chaîne, utilisé la validation des données, et les choses ont bien fonctionné.Questions: Comment convertir une chaîne JTO2.org DateTime en C# DateTime

Cependant, j'ai cette date JSON2.js de Firefox 3.6:

"/Date(1288296203190)/" 

Comment puis-je tourner cela dans une date valide en C#?

var a = new DateTime(1288296203190); 

qui ne donne pas la bonne date (1/2/0001 11:47:09) au lieu du 28 octobre 2010 Jeu 16:03:23 GMT-0400 (heure avancée de l'Est). C'est probablement parce qu'un entier de 32 bits n'a que 10 chiffres. Cependant, cela échoue aussi:

var a = Int64.Parse("1288296203190"); 
var b = new DateTime(a); 

La valeur de b est 1/2/0001 11:47:09 AM.

Qu'est-ce qu'il a fait? Emballage? Est-ce une sorte de voyage dans le temps "bit signé" question?

Répondre

2

Le problème est la différence d'époque. On dirait que la date JSON2.js que vous avez utilise l'époque unix (1er janvier 1970) mesurée en ms. De l'System.DateTime (tiques long) documenttion:

attend une date et l'heure exprimée en nombre d'intervalles de 100 nanosecondes qui se sont écoulées depuis le 1er Janvier, 0001 à 00: 00: 00.000 dans le calendrier grégorien.

Quelque chose comme ceci devrait vous obtenir ce que vous voulez.

var unixEpoch = DateTime(1970, 1, 1); 
var ticksSinceEpoch = 1288296203190 * 10000; 
var time = new DateTime(unixEpoch.Ticks + ticksSinceEpoch); 
+0

Fantastique. Ajouter une nouvelle devant DateTime et soustraire quatre heures pour le fuseau horaire, et votre réponse est correcte. :) Merci beaucoup. –

+0

Peut-être quelque chose comme ça DateTime.UtcNow.Subtract (DateTime.Now) –

+0

Probablement besoin de l'heure d'été quelque part aussi –

0

Cette question est essentiellement le même que celui-ci: ASP.net c# Parse int as datetime.

Et je pense que la réponse acceptée est meilleure que celle de @ matheeeny (bien que Matheeeny ait bien expliqué le problème de la solution originale de OP).

Je copie ici LukeH's accepted answer:

var dt = new DateTime(1970, 1, 1).AddMilliseconds(1286294501433); 

Vous pourriez aussi avoir besoin de spécifier le DateTimeKind explicitement, en fonction de vos besoins précis:

var dt = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc) 
      .AddMilliseconds(1286294501433); 
1

Et il y a encore mieux façon (qui prend également en compte votre fuseau horaire local):

Il suffit de créer ce nombre entier Extension -

public static class currency_helpers { 
    public static DateTime UNIXTimeToDateTime(this int unix_time) { 
     return new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).AddSeconds(unix_time).ToLocalTime(); 
    } 
    } 

Et puis appelez partout où comme ceci:

var unix_time = 1336489253;  
var date_time = unix_time.UNIXTimeToDateTime(); 

La valeur de date_time est:

5/8/2012 10:00:53 AM 

(via: http://www.codeproject.com/Articles/10081/UNIX-timestamp-to-System-DateTime?msg=2494329#xx2494329xx)

1
var jsonDate = "/Date(1288296203190+0530)/"; 
var strSec = jsonDate.Substring(6, 13); 
var strTimeZone = jsonDate.Substring(19, 5); 
sec = double.Parse(strSec); 
var timeZoneHr = double.Parse(strTimeZone); 
var timeZoneMin = timeZoneHr % 100; 
timeZoneHr = Math.Ceiling(timeZoneHr/100); 
var date = new System.DateTime(1970, 1, 1, 0, 0, 0, 0) 
    .AddMilliseconds(sec) 
    .AddHours(timeZoneHr) 
    .AddMinutes(timeZoneMin); 

J'ai analysé la chaîne moi-même. Cela fonctionne bien pour moi. N'importe qui a d'autres moyens optimisés, s'il vous plaît faites le moi savoir.

Questions connexes