简要背景:
我试图使用QCustomPlot版本1.3 beta来绘制股票的烛台图表。 我跳过了库的代码,发现对于时间序列,它使用了一个type-def(qcustomplot.h:第3140行)
typedef QMap<double, QCPFinancialData> QCPFinancialDataMap;
其中 QCPFinancialData 是(qcustomplot.h:第3124行)
class QCP_LIB_DECL QCPFinancialData
{
public:
QCPFinancialData();
QCPFinancialData(double key, double open, double high, double low, double close);
double key, open, high, low, close;
};
因此,OHLC数据显然存在,并且该类使用QMap中使用的密钥来索引时间序列条目。
所以,显而易见的关键是日期时间(我正在绘制日终图表,因此每个条目只是一个日期,没有时间使用)。在我的解析代码中,我使用了
boost::gregorian::date
因为它有很多优点(从字符串转换,计算日期时间等)。
问题是,我应该继续将boost :: gregorian :: date转换为unix时间戳,然后将该时间戳记录为double吗?我发现a small template function on github将其转换为 time_t 类型,但我想在这种情况下双重不应该是一个问题,或者这是一个潜在的错误? AFAIK,Unix时间戳表示自1970年1月1日以来的秒数,当表示为双精度时,对于一个键来说应该足够了?
在QCustomPlot的示例中,它们使用累加器/计数器,因为时间序列序列的开始(例如,开始日期)而不是时间戳。
答案 0 :(得分:2)
由于纪元(即1970年1月1日)和仍有足够的分辨率,所以时间戳可以非常方便地存储在双倍中,因为你有足够的空间用于秒超过一微秒。
例如R这样做:
R> now <- Sys.time() # get current date and time
R> now # default format to test
[1] "2014-11-11 20:38:27.307228 CST" # NB I have an option set for subsec.
R> as.integer(now) # as integer: seconds since epoch
[1] 1415759907
R> as.double(now) # as double under default precision
[1] 1415759907
R> print(as.double(now), digits=16) # as double with forced higher prec.
[1] 1415759907.307228
R>
我一直在C / C ++层使用double
。如果我没弄错的话,你可以
让Boost为你做转换。
编辑:我知道我在某处:
boost::posix_time::ptime pt;
// ... in what follows dt has subcomponents we can access
pt = boost::posix_time::ptime(boost::gregorian::date(dt.getYear(),
dt.getMonth(),
dt.getDay()),
boost::posix_time::time_duration(dt.getHours(),
dt.getMinutes(),
dt.getSeconds(),
dt.getMicroSeconds()/1000.0));
转换为time_t
,包括subseconds:
boost::posix_time::ptime dt = ....
boost::posix_time::ptime epoch(boost::gregorian::date(1970,1,1));
boost::posix_time::time_duration x = dt - epoch; // needs UTC to local corr.,
// but we get the fract. sec.
struct tm t = boost::posix_time::to_tm(dt); // this helps with UTC conve.
time_t tt = mktime(&t) + 1.0 * x.fractional_seconds() / x.ticks_per_second()));