2017-01-31 1 views
2

Je suis tout à fait nouveau à C++ si Thera sont un tas de questions que j'ai mais pour l'instant celui-ci entraîne mon fou:C++: comment obtenir une longue valeur de JSON et le convertir en time_point

I Avons une réponse de JSON et voulons analyser un objet aussi longtemps (parce que c'est un horodatage). Après que je veux tp analyser tout ce temps pour un objet time_point via

chrono::system_clock::from_time_t(...); 

Voilà donc ce que je suis pour l'instant:

auto last_change_date_long = (long long)json_troubleticket["lastChangeDate"].int_value(); 
time_t last_change_date_raw = time_t(last_change_date_long); 
auto last_change_date = chrono::system_clock::from_time_t(last_change_date_raw); 

Il compile, mais si je cours ce (alors que je sais que la valeur pour lastChangeDate est 1480702672000) il est résultat est 2147483647000 ...

quelqu'un at-il une suggestion qui a mal tourné?

+3

Je devine la fonction int_value() tronque la valeur car il est à la conversion d'un entier. –

+0

Avez-vous remarqué que 2147483647 est 0x7FFFFFFF (INT_MAX)? – rustyx

Répondre

1

Cela le fera:

auto i = 1480702672000; 
std::chrono::system_clock::time_point tp{std::chrono::milliseconds{i}}; 

Notez que ce qui précède n'est pas garanti travailler par la norme parce que l'époque de system_clock est non spécifiée. Cependant toutes les implémentations utilisent actuellement Unix Time, et j'ai un accord informel avec les implémenteurs pour qu'ils ne s'en écartent pas pendant que j'essaie de standardiser cette pratique existante.

La raison pour laquelle vous voyez le comportement que vous avez, c'est que votre json compte les millisecondes depuis 1970-01-01 00:00:00 UTC, mais time_t compte généralement les secondes (bien que cela ne soit pas non plus spécifié par la norme) . Ainsi, au moment où vous créez last_change_date_raw depuis last_change_date_long, vous convertissez implicitement des millisecondes en secondes. Cela se traduirait par une date au milieu de l'année 48891. La mise en œuvre de from_time_t est probablement flipper à ce sujet (débordement).

FWIW, ce point de temps particulier représente:

2016-12-02 18:17:52.000 UTC 
+0

la réponse de JSON a changé, donc je n'ai aucune chance de tester cela maintenant. – grumpyshoe

+0

@grumpyshoe: Je serais heureux d'afficher d'autres points de temps formés en UTC en fonction de vos entrées actuelles. Le temps de latence peut être des heures. Je ferai de mon mieux. –