C ++ Boost将UNIX时间戳转换为MySQL兼容的DATETIME字符串

时间:2016-02-20 06:44:09

标签: c++ mysql datetime unix boost

我试图将长时间的UNIX时间戳转换为需要存储在MySQL中的日期时间字符串,格式为2016-02-01 03:15:10

这是我到目前为止所拥有的。它没有在时间提取部分工作。我无法找到boost :: posix_time :: time_duration的任何构造函数,它可以直接使用boost :: posix_time :: ptime对象。所以我试图包括一个解决方法。但它在小时()部分不起作用。

static inline std::string getDateTime(long timestamp) {
      std::stringstream date_str;
      boost::posix_time::ptime pt_1 = boost::posix_time::from_time_t(timestamp);

      /* workaround to somehow get a time_duration object constructed */
      boost::posix_time::ptime pt_temp = boost::posix_time::from_time_t(0);

      boost::gregorian::date d = pt_1.date();

      boost::posix_time::time_duration td = pt_1 - pt_temp;

      /* construct the Date Time string */
      date_str << d.year() << "-" << std::setw(2) << std::setfill('0') << d.month().as_number() << "-" << std::setw(2) << std::setfill('0') << d.day() << " "
               << td.hours() << ":" << td.minutes() << ":" << td.seconds();

      return date_str.str();
    }

使用时间戳输入,例如1455892259我将此2016-02-19 404414:30:59作为函数的DateTime字符串。如何实际获取正确的日期时间字符串,在这种情况下为2016-02-19 14:30:59。使用Boost是必须的。

更新

这是使用下面的Jarra McIntyre提供的答案重写的最终工作函数。

static inline std::string getDateTime(long timestamp) {
      std::stringstream date_str;
      boost::posix_time::ptime pt_1 = boost::posix_time::from_time_t(timestamp);

      boost::gregorian::date d = pt_1.date();

      auto td = pt_1.time_of_day();

      /* construct the Date Time string */
      date_str << d.year() << "-" << std::setw(2) << std::setfill('0') << d.month().as_number() << "-" << std::setw(2) << std::setfill('0') << d.day() << " "
               << td.hours() << ":" << td.minutes() << ":" << td.seconds();

      return date_str.str();
    }

1 个答案:

答案 0 :(得分:1)

使用

auto td = pt_1.time_of_day();

无需解决方法来获取时间。您问题中显示的小时数可能是1970-01-01 00:00到2016-02-19 14:00之间的小时数。对于使time_duration工作的方法,你必须在同一天构建一个ptime,而不是在unix时间0。