私のプログラムに人間が読めるタイムスタンプがあります。私はそれらをデータベースに保存し、それらをさまざまな方法で使用したいと考えています。私はそれをより簡単でより効率的なものとして表現することを好むでしょうが、読み込みに便利なものと人間には便利なものの間を転がることができるのも便利です。情報を失うことなく、人間が読める日付をミリ秒に変換して返します。
私は、人が読めるタイムスタンプをlongとbackに変換したり、戻したりする関数を含む、以下のテストプログラムをハッキングしました。
// g++ -o timetest timetest.cpp -std=c++11
#include <iostream>
#include <sstream>
#include <boost/date_time.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/date_time/posix_time/posix_time_io.hpp>
long millis_from_date(const std::string& s)
{
boost::posix_time::ptime pt;
std::istringstream is(s);
auto* f = new boost::posix_time::time_input_facet("%Y-%m-%dT%H:%M:%S.%FZ");
std::locale loc(std::locale(""), f);
is.imbue(loc);
is >> pt;
boost::posix_time::ptime timet_start(boost::gregorian::date(1970,1,1));
boost::posix_time::time_duration diff = pt - timet_start;
return diff.total_milliseconds();
}
std::string date_from_millis(long ms)
{
static const boost::posix_time::ptime epoch(boost::gregorian::date(1970,1,1));
boost::posix_time::time_facet * facet = new boost::posix_time::time_facet("%Y-%m-%dT%H:%M:%S.%fZ");
std::ostringstream stream;
stream.imbue(std::locale(stream.getloc(), facet));
stream << epoch + boost::posix_time::milliseconds(ms);;
return stream.str();
}
int main()
{
std::string time = "2016-04-14T07:47:50.120043Z";
std::cout << "Initial input: " << time << std::endl;
std::cout << std::endl;
{
long millis = millis_from_date(time);
std::cout << "Initial input in millis: " << millis << std::endl;
std::string newtime = date_from_millis(millis);
std::cout << "Converted back to date: " << newtime << std::endl;
}
{
long millis = millis_from_date(time);
std::cout << "Initial input in millis: " << millis << std::endl;
std::string newtime = date_from_millis(millis);
std::cout << "Converted back to date: " << newtime << std::endl;
}
return 0;
}
次はサンプル出力です。あなたが見ることができるように
Initial input: 2016-04-14T07:47:50.120043Z
Initial input in millis: 1460620070000
Converted back to date: 2016-04-14T07:47:50.000000Z
Initial input in millis: 1460620070000
Converted back to date: 2016-04-14T07:47:50.000000Z
、ミリ秒に変換し、小数第二の情報は何を得ることは端にタック000
でエポックの開始からの秒であるので失われます。従って、得られた長い時間を人間可読のタイムスタンプに変換すると、小数第2情報は失われる。
これまでにかなり多くのことを試みましたが、millis_from_date関数が分数秒の情報を失うことなく動作する方法を理解できません。何か案は??
はあなたにミハイルをありがとう、私はあなたのアドバイスに従い、今ではすべてが正確にそれが必要として動作します。 – user6247858
@ user6247858あなたはようこそ! – Mikhail