2009-08-13 6 views
2

J'ai une application C# qui sérialise ses DTOs à JSON et leur envoie le fil à traiter par Ruby. Maintenant, le format de la date sérialisé est comme ceci:C# serialized date JSON à ruby ​​

/Date(1250170550493+0100)/ 

Lorsque cette touche l'application Ruby je dois lancer cette représentation de chaîne de retour à une date/datetime/heure (quoi que ce soit en Ruby). Des idées comment j'irais à ce sujet?

Cheers, Chris.

Répondre

3

Vous pouvez les millisecondes analysez depuis l'époque, quelque chose comme:

def parse_date(datestring) 
    seconds_since_epoch = datestring.scan(/[0-9]+/)[0].to_i/1000.0 
    return Time.at(seconds_since_epoch) 
end 

parse_date('/Date(1250170550493+0100)/') 

Vous auriez encore besoin de gérer les informations de fuseau horaire (la partie +0100), donc c'est un point de départ.

+1

'parse_date ('/ date (1250170550493 + 0100) /')' retourne '41586-04-30 15:21:33 + 0200' – narzero

+0

@narzero vous avez raison, dans ce cas c'est millisecondes depuis l'époque, pas de secondes depuis l'époque. Fixation. – orip

3

Vous pouvez utiliser Json.NET pour sérialiser vos DTO au lieu du sérialiseur JSON .NET intégré. Il vous donne la flexibilité sur la façon de sérialiser les dates (c'est-à-dire en tant que constructeur, format ISO, etc.).

+0

+1, excellente option si vos exigences vous permettent de changer le format de sérialisation de la date à quelque chose Ruby aime mieux – orip

+0

BTW - nous utilisons JSON.NET tout le temps, une grande bibliothèque. Merci James! – orip

2

.NET sérialise en millisecondes de l'époque, de sorte que vous devez diviser la partie avant le fuseau horaire par 1000. D'autres sages dates seront des milliers d'année sabbatique

0

Vous pouvez utiliser Time.strptime pour analyser à un Time objet avec le fuseau horaire correct:

Time.strptime(string, "/Date(%Q%z)/") 

par exemple:

string = "/Date(1250170550493+0100)/" 
Time.strptime(string, "/Date(%Q%z)/") 
#=> 2009-08-13 14:35:50 +0100