2009-07-22 4 views
10

Je dois convertir en double le nombre de secondes depuis l'époque jusqu'à ptime. Je suis sûr qu'il doit y avoir un moyen facile de le faire, mais je n'ai rien trouvé. Merci.timestamp unix pour booster :: posix_time :: ptime

Édition: l'horodatage d'origine est à virgule flottante. Je ne peux pas le changer et je ne veux pas perdre la précision en-dessous de la seconde.

+0

Vous êtes sûr d'avoir besoin d'un double? Je pense que cela correspond à un int. – slipbull

+1

Oui, j'ai besoin de double - c'est une partie d'une interface que je ne peux pas changer. Si c'est un nombre de secondes alors vous ne pouvez pas capturer la partie fractionnaire ... et http://xkcd.com/607/ :-) – cube

Répondre

5

après quelques bidouiller je suis venu avec ceci:

ptime(date(1970, 1, 1), time_duration(0, 0, 0, time_duration::ticks_per_second() * 1234567890.0987654321)) 

Je ne suis pas sûr que ce soit la meilleure solution, mais il semble faire ce que je dois.

8

Utilisez la fonction de conversion from_time_t(). Un time_t est un horodatage UNIX, c'est-à-dire le nombre de secondes écoulées depuis l'époque.

+1

time_t ne peut pas contenir des fractions de secondes, mais merci pour la réponse – cube

+0

' time_t' est un horodatage UNIX sur presque toutes les plateformes, mais la norme C++ ne spécifie pas ce comportement. Alors soyez prudent avec cette traduction. –

7

Pour une machine qui a la date/heure boost compilé au niveau par défaut de la résolution de microseconde, essayez ceci:

double ts = 1250524800.5; 
// Use floor() here if seconds are always positive. 
time_t secondsSinceEpoch = floor(ts); 
long microsecondsSinceSecond = 
    floor((ts - static_cast<double>(secondsSinceEpoch)) * 1000000); 
boost::posix_time::ptime result = 
    boost::posix_time::from_time_t(secondsSinceEpoch); 
boost::posix_time::time_duration fractionalSeconds(0, 0, 0, 
                microsecondsSinceSecond); 
result += fractionalSeconds; 
cout << "Time stamp is " << result << endl; 

La sortie de c'est « Horodatage est 2009-Aug-17 16:00: 00.500000 "sur ma boîte Linux.

+2

Vous souhaitez probablement ajouter un '+ 0.5' à votre calcul' microsecondsSinceSecond' pour obtenir un arrondi au plus proche. Sinon, vous allez souffrir de bugs de troncature. Bien que ... je suppose que n'importe qui qui se soucie de la différence d'une demi-microseconde ne stockerait probablement pas un horodatage dans un 'double 'en premier lieu. – Tom

+0

@Tom: Vous avez raison, même si je m'attends à ce que toute personne qui se soucie vraiment de ce niveau de résolution configure sa distribution Boost pour le support de la nanoseconde et apporte les modifications appropriées au code ci-dessus. –

+0

+1 Excellent extrait de code représentant les fractions de secondes. –