Преобразование миллисекундного UTC в человекочитаемый Date_Time - PullRequest
2 голосов
/ 13 февраля 2012

Я пытаюсь выяснить, как выполнить преобразование с помощью boost :: date_time.Я хочу преобразовать значение в миллисекундах, измеренное в эпоху Unix (00:00, 1 января 1970 г.), в читаемую человеком строку - что-то вроде: 2/13/2012 15:20:11 было бы идеально.

Я пробовал некоторые стандартные значенияC ++ / boost предложения, которые я видел, но пока не повезло.Вот код, который я использую:

    long long ticksFromEpoch = 1329117220501;

    std::time_t tt = static_cast<time_t>(ticksFromEpoch);

    boost::posix_time::ptime dt = boost::posix_time::from_time_t(tt);

    // Create a time_zone_ptr for the desired time zone and use it to create a local_date_time
    boost::local_time::time_zone_ptr zone(new boost::local_time::posix_time_zone("UTC"));
    boost::local_time::local_date_time dt_with_zone(dt, zone);

    std::stringstream strm;

    strm.imbue(std::locale(std::cout.getloc(), new boost::local_time::local_time_facet("%Y-%m-%d %H:%M:%S"))); // 15:14
    strm << dt_with_zone;

    // Print the stream's content to the console
    std::cout << strm.str() << std::endl;

Вывод: 2032-07-01 20:20:37, что явно неверно.Я подозреваю, что неправильно строю переменную ticksFromEpoch, но не знаю почему.Может кто-то указать мне верное направление?Любая помощь очень ценится!

1 Ответ

5 голосов
/ 13 февраля 2012

time_t - это обычно секунды с начала эпохи, а не миллисекунды. Если вам не нужны миллисекунды, вы можете сделать это:

std::time_t tt = static_cast<time_t>(ticksFromEpoch/1000)

Если вам небезразличны миллисекунды, вы можете либо добавить их обратно в конце (что сложно сделать правильно в такие моменты, как 12: 00: 00.001 AM)

Или вам нужно пойти другим путем. Возможно, вам придется использовать что-то вроде этого: (не проверено)

boost::posix_time::ptime t2(
  date(1970,Jan,1),  //The epoch
  boost::posix_time::seconds( ticksFromEpoch / 1000 ) + // Number of seconds
  boost::posix_time::microseconds( ticksFromEpoch % 1000)  // And the micros too.
  );
...