如何在c++中用localtime正确初始化时间



我得到了Epoch的开始,在那里我应该得到当前时间:

日期.hpp

#ifndef DATE_HPP
#define DATE_HPP
#include <time.h>
#include <iostream>
#include <sstream>
class Date
{
std::stringstream format;
struct tm *date_tm;
time_t date;
public:
Date() : date(time(NULL)), date_tm(localtime(&date)) {}
Date(std::istream &in);
Date(std::string str);
const std::string getDate();
};
#endif //DATE_HPP

date.cpp

#include "date.hpp"
#include <iostream>
#include <sstream>
#include <iomanip>
Date::Date(std::istream &in)
{
std::cout << "enter date [mm/dd/yy]: ";
format.basic_ios::rdbuf(in.rdbuf());
format >> std::get_time(date_tm, "%m/%d/%y");
}
Date::Date(std::string str)
{
format << str;
format >> std::get_time(date_tm, "%m/%d/%y");
}
const std::string Date::getDate()
{
format << std::put_time(date_tm, "%m/%d/%y");
return format.str();
}

main.cpp

#include "date.hpp"
#include <iostream>
int main()
{
Date now;
std::cout << now.getDate() << std::endl;
}

当我运行它./a.out时,我得到01/01/70。很明显,我希望当前时间,因为localtime(now)中使用的time(NULL)应该包含从Epoch的秒。那么可能出了什么问题呢?

除了注释中提到的缺陷(localtime()返回一个指向全局的指针(,您还遇到了施工订单问题。

在类中,date_tmdate之前构造/初始化,而不管它们在初始化列表中的顺序如何。

更改类定义以查看您期望的结果:

class Date
{
std::stringstream format;
time_t date;        // ensure date is constructed/initialized before date_tm
struct tm *date_tm;
// ...
}

(请参见:https://ideone.com/FRJrdB)

如注释中所述,如果启用了适当的警告级别,编译器应该对此发出警告。

最新更新