8
votes

Date de conversion .Net Json à ISO

Comment puis-je convertir un format d'heure de date de JSON.net tel que:

/ date (1154970000000 + 0700) /

à iso- ?? format 2011-12-18T23: 34: 59Z

de préférence dans python ou javascript.

ive a décidé de ce dernier comme son semble dans le JS World le plus largement utilisé, lisible humainement lisible et naturellement triéable. Je vais stocker des compensations sur une base d'utilisateur.

Si une implémentation est à nouveau un peu trop demandée, si quelqu'un peut me dire le nom correct des deux formats, je pourrais avoir plus de chance pour comprendre comment convertir.


0 commentaires

4 Réponses :


1
votes
var toISOString = Date.prototype.toISOString ?
    function(d){return d}:
    (function(){
        function t(i){return i<10?"0"+i:i};
        function h(i){return i.length<2?"00"+i:i.length<3?"0"+i:3<i.length?Math.round(i/Math.pow(10,i.length-3)):i};
        function toISOString(){
            return "".concat(
                this.getUTCFullYear(), "-",
                t(this.getUTCMonth() + 1), "-",
                t(this.getUTCDate()), "T",
                t(this.getUTCHours()), ":",
                t(this.getUTCMinutes()), ":",
                t(this.getUTCSeconds()), ".",
                h("" + this.getUTCMilliseconds()), "Z"
            );
        };
        return function(d){
            d.toISOString = toISOString;
            return d;
        }
    })();

6 commentaires

TypeError: Objet Tue août 08 2006 00:00:00 GMT + 0700 (TIC) n'a pas de méthode 'Format'


Mon code ignorait le "+0700", ajout du code pour l'ajouter aux heures / minutes de la date convertie. Veuillez vérifier si tel est le comportement correct, sinon, ignorez simplement l'heure.


@Ariel, @mattcodes: ces numéros de substrateurs codés dur ont un peu suspect un peu ... Qu'en est-il des dates en 1970; sont-ils rembourrés avec des zéros de premier plan? Qu'en est-il des dates avant 1970 (comme l'enregistrement de la date de naissance des rides comme moi)?


@Ariel: Ummm ... il traite un fuseau horaire négatif (-0700) identique à un positif (+ 0700).


Merci John, mis à jour pour permettre des nombres négatifs et un fuseau horaire négatif


@ariel: rassurer des personnes qui ont une difficulté extrême devinant ce que le code fait et ne sait pas comment exécuter JavaScript, que diriez-vous de publier une sortie de test?



3
votes

[Réponse de remplacement]

Voici une version Python 2.x. Seules les instructions d'impression dans la section de test doivent être modifiées pour Python 3.x. P>

Autant que je puisse vérifier par Googling: le composant principal est millisecondes depuis 1970-01-01. Cela peut être négatif. Un signe + code> n'est pas attendu pour des nombres positifs. Ceci peut être suivi d'un décalage optionnel de UTC, qui se compose de 5 caractères: un signe obligatoire ( + code> ou - code>), 2 chiffres pendant des heures et 2 chiffres pendant des minutes. . Tout ce qui précède est précédé de "/ date (" et suivi de ") /". P>

Cette réponse fournit une fonction pour convertir la chaîne JSON.net en un python DateTime.DateTime Code> (horodatamp) objet et 2 fonctions pour renvoyer le format ISO tronqué en secondes et millisecondes respectivement. p>

script: p> xxx pre>

sortie: p> >

2006-08-08T00:00:00.000Z /Date(1154970000000+0700)/
1969-12-31T23:59:58.766Z /Date(-1234)/
1970-01-01T02:00:01.000Z /Date(1000+0200)/
1970-01-01T00:00:00.000Z /Date(0+0000)/
1970-01-01T00:00:00.000Z /Date(0)/
1969-12-31T17:00:00.000Z /Date(0-0700)/
1969-12-31T16:30:00.000Z /Date(0-0730)/
1969-12-31T23:30:00.000Z /Date(0-0030)/
1920-01-01T00:00:00.000Z /Date(-1577923200000+0000)/
1970-01-01T00:00:00.001Z /Date(1)/
1970-01-01T00:00:00.499Z /Date(499)/
1970-01-01T00:00:00.500Z /Date(500)/
1970-01-01T00:00:00.501Z /Date(501)/
1970-01-01T00:00:00.999Z /Date(999)/
1970-01-01T00:00:01.000Z /Date(1000)/
1969-12-31T23:59:59.999Z /Date(-1)/


3 commentaires

@mattcodes: mis à jour avec un meilleur style, moins de bugs et plus de tests :-)


json_date_as_dateTime ("/ date (1428145200000 + 1200) /") → DateTime.date (2015, 4, 4, 23, 0). Pas ce que la version JS ci-dessus fait ...


... Parce que certains des cas de test sont faux (1, 3, 6, 7 et 8). Sauf si j'ai mal compris ce format de date (non bon), la partie Milliseconds est le décalage UTC à partir de l'époque et le décalage en option le transfère à n'importe quel délicat-tempone qu'il représente. Tous les tests ici avec un décalage ne sont pas incorrects dans l'horodatage UTC.



1
votes

Retourne les DateRéstimes ajout de TimeZone et fournit une sortie correcte pour cas de test de John Machin et "/ date (1428145200000 + 1200) / "

python> 3.3 Compatible. Pour 2.7, utilisez pytz.utc au lieu de datetime.timezone.utc . xxx


0 commentaires

0
votes

Voici un petit cours que j'ai écrit il y a des années pour nettoyer ce type de Json invalide que certaines bibliothèques .NET génèrent: xxx pré>

et un cas de test / exemple: P>

def test_can_decode_dotnet_json_dates():                                                                                                                                                                     
    jsonstr = '{"date": "Date(1330848000000)", "f": "b", "l": [], "i": 5}'                                                                                                                                   
    timezone = pytz.timezone('America/New_York')                                                                                                                                                             
    obj = json.loads(jsonstr, cls=DotNETDecoder, timezone=timezone)                                                                                                                                          
    assert obj['date'] == timezone.localize(dt.datetime(2012, 3, 4, 3, 0))                                                                                                                                   
    assert obj['f'] == "b"                                                                                                                                                                                   
    assert obj['i'] == 5                                                                                                                                                                                     
    assert obj['l'] == []


0 commentaires