【问题标题】:QCustomPlot using timestamp to set Date along one axisQCustomPlot 使用时间戳沿一个轴设置日期
【发布时间】:2016-03-05 00:22:30
【问题描述】:

我无法正确设置日期。基本上,我在文本文件中逐行存储时间戳、打开、关闭、高、低、音量(使用 Yahoo API 下载)。然后我的程序读取每一行并将其转换为 QStringList。然后它将列表中的每个项目放入适当的 QVector(dates[]、open[]、close[]、high[]、low[]、volume[]),将每个项目转换为 double。这就是问题所在。转换过程中似乎丢失了精度。当实际时间戳实际上是几天前的日期时,日期始终显示为 1970 年的句点。

#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

【问题讨论】:

    标签: date timestamp qcustomplot


    【解决方案1】:

    我想通了。原来第一列数据是日期而不是时间戳。我想出了这个函数来将 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;
    }
    

    【讨论】:

      猜你喜欢
      • 2016-07-29
      • 2021-05-18
      • 1970-01-01
      • 1970-01-01
      • 2011-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多