2017-08-23 2 views
0

J'ai une entrée JSON. Je voudrais convertir tous les timestamp (createdDate, modifiedDate) à l'heure en ruby. Comment je fais ça? J'ai essayé des méthodes ci-dessous, mais à force de travailRuby: Convertit l'horodatage en date de l'entrée json donnée

characterList.each { |char| DateTime.strptime(char.try(:getEditInfo).try(:getCreatedDate),%s) } 


{"characterList": 
    [ 
    {"editInfo": 
     {"createdBy": "testname", 
     "createdDate": 1503137795000, 
     "modifiedBy": "testname", 
     "modifiedDate": 1503137795000}, 
    "charInfo": 
     {"charid": "3434", 
     "charDesc": "3434", 
     "status": "ON"} 
    }, 
    {"editInfo": 
     {"createdBy": "testname", 
     "createdDate": 1503137795000, 
     "modifiedBy": "testname", 
     "modifiedDate": 1503137795000}, 
    "charInfo": 
     {"charid": "3434 6", 
     "charDesc": "43dfdf", 
     "status": "ON"} 
    }, 
    {"editInfo": 
     {"createdBy": "testname", 
     "createdDate": 1503137795000, 
     "modifiedBy": "testname", 
     "modifiedDate": 1503137795000}, 
    "charInfo": 
     {"charid": "4hr_SLA", 
     "charDesc": "sd", 
     "status": "ON"} 
    }, 
    {"editInfo": 
     {"createdBy": "testname", 
     "createdDate": 1503137795000, 
     "modifiedBy": "testname", 
     "modifiedDate": 1503137795000}, 
    "charInfo": 
     {"charid": "aaaaaaaaaa", 
     "charDesc": "asdfaadsf asdfasdf asdf", 
     "status": "ON"} 
    }, 
    {"editInfo": 
     {"createdBy": "testname", 
     "createdDate": 1503137795000, 
     "modifiedBy": "testname", 
     "modifiedDate": 1503137795000}, 
    "charInfo": 
     {"charid": "abababab", 
     "charDesc": "abababababab", 
     "status": "ON"} 
    } 
    ]} 

Je suis ok conversion en 2 comme séparément pour CreatedDate et ModifiedDate. Mais Im la recherche d'une solution de ligne

Répondre

1

Vous pouvez faire quelque chose comme:

json[:characterList].map! do |character| 
    character.tap do |char| 
    if editInfo = char[:editInfo] 
     if editInfo[:createdDate] 
     editInfo[:createdDate] = 
      DateTime.strptime(editInfo[:createdDate].to_s, '%Q') 
     end 

     if editInfo[:modifiedDate] 
     editInfo[:modifiedDate] =_ 
      DateTime.strptime(editInfo[:modifiedDate].to_s, '%Q') 
     end 
    end 
    end 
end 

les principaux problèmes avec votre code ont été

  1. Pas :getEditInfo ou :getCreatedDate, cependant, ceux-ci peuvent juste être vous méthodes fait mais n'a pas inclus ici.
  2. strptime prend une chaîne, les champs sont *Date entiers
  3. L'argument %s-strptime est le nombre de secondes depuis 1970-01-01 00:00:00 UTC, je vais supposer que vous ne traitez pas les dates de l'année 49602, donc changé à %Q, qui est le nombre de millisecondes depuis 1970-01-01 00:00:00 UTC.

Ceci est juste un exemple, modifier le hachage JSON lui-même avec DateTime objets, vous devrez peut-être faire quelque chose de différent avec elle, la grande chose est ici la %Q et to_s dans strptime s

DateTime.strptime(1503137795000.to_s, '%Q') # => 2017-08-19T10:16:35+00:00 

Sans savoir ce qui est en fait de mal à votre code (« ne fonctionne pas » est pas très descriptif), si tout le reste sur cette ligne que vous avez essayé de travail vous pouvez simplement changer pour:

characterList.each { |char| DateTime.strptime(char.try(:getEditInfo).try(:getCreatedDate).to_s,'%Q') } 

pour un liner