Текущая дата и время в виде строки
Я написал функцию для получения текущей даты и времени в формате: DD-MM-YYYY HH:MM:SS
. Это работает, но пусть говорят, это довольно уродливо. Как я могу сделать точно то же самое, но проще?
string currentDateToString()
{
time_t now = time(0);
tm *ltm = localtime(&now);
string dateString = "", tmp = "";
tmp = numToString(ltm->tm_mday);
if (tmp.length() == 1)
tmp.insert(0, "0");
dateString += tmp;
dateString += "-";
tmp = numToString(1 + ltm->tm_mon);
if (tmp.length() == 1)
tmp.insert(0, "0");
dateString += tmp;
dateString += "-";
tmp = numToString(1900 + ltm->tm_year);
dateString += tmp;
dateString += " ";
tmp = numToString(ltm->tm_hour);
if (tmp.length() == 1)
tmp.insert(0, "0");
dateString += tmp;
dateString += ":";
tmp = numToString(1 + ltm->tm_min);
if (tmp.length() == 1)
tmp.insert(0, "0");
dateString += tmp;
dateString += ":";
tmp = numToString(1 + ltm->tm_sec);
if (tmp.length() == 1)
tmp.insert(0, "0");
dateString += tmp;
return dateString;
}
Ответы
Ответ 1
Решение не С++ 11: с заголовком <ctime>
вы можете использовать strftime
. Удостоверьтесь, что ваш буфер достаточно велик, вы не захотите его захватить и нанести вред позже.
#include <iostream>
#include <ctime>
int main ()
{
time_t rawtime;
struct tm * timeinfo;
char buffer[80];
time (&rawtime);
timeinfo = localtime(&rawtime);
strftime(buffer,sizeof(buffer),"%d-%m-%Y %I:%M:%S",timeinfo);
std::string str(buffer);
std::cout << str;
return 0;
}
Ответ 2
С С++ 11 вы можете использовать std::put_time
из iomanip
:
#include <iostream>
#include <iomanip>
#include <ctime>
int main()
{
auto t = std::time(nullptr);
auto tm = *std::localtime(&t);
std::cout << std::put_time(&tm, "%d-%m-%Y %H-%M-%S") << std::endl;
}
std::put_time
- это манипулятор потока, поэтому его можно использовать вместе с std::ostringstream
, чтобы преобразовать дату в строку:
#include <iostream>
#include <iomanip>
#include <ctime>
#include <sstream>
int main()
{
auto t = std::time(nullptr);
auto tm = *std::localtime(&t);
std::ostringstream oss;
oss << std::put_time(&tm, "%d-%m-%Y %H-%M-%S");
auto str = oss.str();
std::cout << str << std::endl;
}
Ответ 3
вы можете использовать asctime() функцию time.h, чтобы получить строку просто.
time_t _tm =time(NULL );
struct tm * curtime = localtime ( &_tm );
cout<<"The current date/time is:"<<asctime(curtime);
Пример вывода:
The current date/time is:Fri Oct 16 13:37:30 2015
Ответ 4
Я хотел использовать ответ С++ 11, но я не мог, потому что GCC 4.9 не поддерживает std:: put_time.
Статус std:: put_time в GCC?
В итоге я использовал некоторый С++ 11, чтобы немного улучшить ответ на не-С++ 11. Для тех, кто не может использовать GCC 5, но все равно хотел бы, чтобы некоторые С++ 11 в формате даты/времени:
std::array<char, 64> buffer;
buffer.fill(0);
time_t rawtime;
time(&rawtime);
const auto timeinfo = localtime(&rawtime);
strftime(buffer.data(), sizeof(buffer), "%d-%m-%Y %H-%M-%S", timeinfo);
std::string timeStr(buffer.data());
Ответ 5
Используя С++ в MS Visual Studio 2015 (14), я использую:
#include <chrono>
string NowToString()
{
chrono::system_clock::time_point p = chrono::system_clock::now();
time_t t = chrono::system_clock::to_time_t(p);
char str[26];
ctime_s(str, sizeof str, &t);
return str;
}