2016-03-05 36 views
1

我無法正確設置日期。基本上我有時間戳,打開,關閉,高,低,音量在一個文本文件中逐行存儲(使用雅虎API下載)。我的程序然後讀取每行並將其轉換爲QStringList。然後它將每個項目放入相應的QVector(日期[],打開[],關閉[],高],低[],音量[]),將每個項目轉換爲雙精度。這是問題所在。看來在轉換過程中精度會丟失。日期始終顯示爲1970年的實際時間戳實際上是幾天前的日期。QCustomPlot使用時間戳設置沿一個軸的日期

#include "dialog.h" 
#include "ui_dialog.h" 
#include<QFile> 
#include<QTextStream> 
#include<string> 
#include<iostream> 
#include<ctime> 
using namespace std; 

Dialog::Dialog(QWidget *parent) : 
    QDialog(parent), 
    ui(new Ui::Dialog) 
{ 
    ui->setupUi(this); 
    QStringList lines; 
    QString line; 

    QVector<double> dates; 
    QVector<double> high; 
    QVector<double> low; 
    QVector<double> open; 
    QVector<double> close; 
    QVector<double> volume; 

    QFile file ("YHOO.cvs"); 
    if(file.open(QIODevice::ReadOnly)) 
    { 


     QTextStream in(&file); 
     while (!in.atEnd()) 
     { 

      line = in.readLine(); 
      lines = line.split(","); 
      dates.append(lines[0].toDouble()); 
      close.append(lines[1].toDouble()); 
      high.append(lines[2].toDouble()); 
      low.append(lines[3].toDouble()); 
      open.append(lines[4].toDouble()); 
      volume.append(lines[5].toInt()); 
     } 
     file.close(); 
    } 
    else{ 

     QMessageBox::information(0,"info",file.errorString()); 
    } 


    ui->plot->addGraph(); 

    ui->plot->graph(0)->setData(dates, high); 


    ui->plot->xAxis->setTickLabelType(QCPAxis::ltDateTime); 
    ui->plot->xAxis->setDateTimeFormat("MM/dd/yyyy"); 

    QPen pen; 
    pen.setColor(QColor(200,200,200)); 

    ui->plot->graph(0)->setPen(pen); 
    ui->plot->graph(0)->setLineStyle(QCPGraph::lsLine); 
    ui->plot->graph(0)->setBrush(QBrush(QColor(160,50,150))); 

    ui->plot->xAxis->setRange(dates[0], dates[dates.length()-1]); 
    ui->plot->yAxis->setRange(*std::min_element(high.begin(), high.end()),*std::max_element(high.begin(),high.end())); 

} 

Dialog::~Dialog() 
{ 
    delete ui; 
} 

YHOO.cvs

20140227,30.1000,30.1600,28.4100,29.7000,2351300 
20140228,28.3000,32.0000,27.0000,29.2000,3781000 
20140303,28.1900,28.9100,26.8900,27.3000,1664900 
20140304,30.0400,30.3800,28.6300,28.8500,2341700 
20140305,28.5500,29.5000,28.4900,29.2400,7314100 
20140306,27.1700,29.0100,27.1500,28.7600,3007300 
20140307,27.2000,28.3200,26.7100,27.8400,2961800 
20140310,28.2400,28.5000,27.3500,27.7200,1622100 
20140311,27.5300,28.7400,27.1800,28.4400,1745200 
20140312,28.5400,28.7400,27.3500,27.4700,2206300 

回答

0

我想通了。發現第一列數據是日期而不是時間戳。我想出了這個函數將QString轉換爲雙值時間戳。

double timeStamp(QString qs){ 
    char tempDate[10]; 
    memcpy(tempDate, qs.toStdString().c_str(), 10); 
    char date[] = "   "; 
    date[0] = tempDate[0]; 
    date[1] = tempDate[1]; 
    date[2] = tempDate[2]; 
    date[3] = tempDate[3]; 
    date[4] = '\0'; 
    date[5] = tempDate[4]; 
    date[6] = tempDate[5]; 
    date[7] = '\0'; 
    date[8] = tempDate[6]; 
    date[9] = tempDate[7]; 

    struct tm tmdate = {0}; 
    tmdate.tm_year = atoi(&date[0]) - 1900; 
    tmdate.tm_mon = atoi(&date[5]) - 1; 
    tmdate.tm_mday = atoi(&date[8]); 
    time_t t = mktime(&tmdate); 

    double actual_time_sec = difftime(t,0); 

    return actual_time_sec; 
}