web-dev-qa-db-fra.com

Comment convertir boost :: posix_time :: ptime en time_t?

Existe-t-il un moyen "standard" ou le mieux que je puisse faire est de le calculer directement en soustrayant de gregorian::date(1970,1,1)?

42
ybungalobill

time_t Est le type utilisé pour conserver le temps en secondes (généralement le temps Epoch). Je suppose que vous êtes après le temps d'Epoch, si c'est le cas, je ne suis pas au courant de la manière d'obtenir le temps d'Epoch directement, à part la soustraction que vous avez déjà. Une fois que vous avez un time_duration (Résultat de la soustraction), vous pouvez appeler total_seconds() sur la durée et l'enregistrer dans time_t.

btw. si vous êtes après le temps d'Epoch, vous pouvez simplement utiliser gettimeofday() et vous éviter des maux de tête!

14
Nim

Puisque la méthode de @ icecrime convertit deux fois (ptime utilise une représentation linéaire en interne), j'ai décidé d'utiliser à la place le calcul direct. C'est ici:

time_t to_time_t(boost::posix_time::ptime t)
{
    using namespace boost::posix_time;
    ptime Epoch(boost::gregorian::date(1970,1,1));
    time_duration::sec_type x = (t - Epoch).total_seconds();

    // ... check overflow here ...

    return time_t(x);
}

EDIT: Merci @jaaw d'avoir porté cela à mon attention. Depuis le boost 1.58, cette fonction est incluse dans date_time/posix_time/conversion.hpp, std::time_t to_time_t(ptime pt).

35
ybungalobill

Voici une variante de la méthode de @ ybungalobill qui vous fera dépasser 2038, au cas où. :)

int64_t rax::ToPosix64(const boost::posix_time::ptime& pt)
{
  using namespace boost::posix_time;
  static ptime Epoch(boost::gregorian::date(1970, 1, 1));
  time_duration diff(pt - Epoch);
  return (diff.ticks() / diff.ticks_per_second());
}
15
kgriffs

Je crois que le mieux que vous puissiez faire est d'utiliser to_tm pour obtenir un tm et mktime pour convertir le tm en time_t.

5
icecrime

Ces 2 lignes devraient le faire.

tm td_tm = to_tm(pt);
time_t tt = mktime(&td_tm);
2
Ramesh