当前日期和时间为字符串


74

我编写了一个函数,用于获取格式为的当前日期和时间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;
}


使用起来会不会更简单std::strftime
一些程序员伙计


这是一个有关如何使用boost进行操作的问题(和答案)(如果您不能使用C ++ 11):
maverik 2013年

Answers:


122

非C ++ 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 %H:%M:%S",timeinfo);
  std::string str(buffer);

  std::cout << str;

  return 0;
}

3
如果它溢出缓冲区呢?我想应该有一个返回值strftime,您需要用真实代码检查否?
Matthieu M.

5
对于任何给定的格式字符串,计算最大可能的字符串长度并不需要太多考虑。
拉斐尔·巴普蒂斯塔

我不明白为什么您可以通过从顶部开始的第10行上的值传递rawtime,因为时间可以使用一个指向time_t类型的指针:cplusplus.com/reference/ctime/time在该页面的示例中,他们使用了time()我不明白的同样方式。谁能向我解释一下?
Michael Trouw,2015年

1
那里有一个&。这意味着rawtime将传递其在内存中的地址,而不是传递变量的内容……这就是存储在指针变量中的内容。
最多

要获取毫秒数:auto now = std :: chrono :: system_clock :: now(); std :: chrono :: time_point <std :: chrono :: system_clock>时代; int ms = std :: chrono :: duration_cast <std :: chrono ::毫秒>(现在-epoch).count()%1000;
scrutari

160

从C ++ 11开始,您可以使用std::put_timefromiomanip头文件:

#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;
}

35
std::put_time在gcc 4.9中仍然缺少。
Yuriy Petrovskiy 2014年

5
gcc 5.0有它,但是没有早期版本。
SmallChess 2015年

@soon我有一个问题。在我的代码中,我有一个应该返回时间的函数。返回当前时间的函数的返回类型应该是什么?

@ArnavBorborah,这取决于。您可以返回Unix格式的时间,Boost Local日期时间或创建自己的类型。
awesoon

localtime不是线程安全的。考虑改用localtime_r。
Homer6

24

您可以使用time.h的asctime()函数简单地获取一个字符串。

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

3
不,您不能:asctime不提供问题中要求的日期/时间格式!
阿空加瓜

2
@Aconcagua虽然没有,但确实可以给您时间。代码简洁明了。
SmallChess

4
如果简洁的代码不能提供所需的内容,则无济于事。想要一辆卡车(串),您就得到一辆。想要运输液体,您需要一辆油罐车,而不会很高兴得到自卸车……
阿空加瓜

3
好的答案,但是asctime()的错误主意是返回LF终止的字符串...
solendil 2015年

1
此外,asctime它不是对语言环境敏感strftime的。
罗伊·丹顿

4
#include <chrono>
#include <iostream>

int main()
{
    std::time_t ct = std::time(0);
    char* cc = ctime(&ct);

    std::cout << cc << std::endl;
    return 0;
}

3
感谢您提供此代码段,它可能会提供一些有限的即时帮助。通过说明为什么这是一个很好的解决方案,正确的解释将大大提高其长期价值,对于其他存在类似问题的读者来说,这样做将更为有用。请修改您的答案以添加一些说明,包括您所做的假设,例如#include
Melebius

2
这实际上返回了什么?
史蒂夫·史密斯

3

在MS Visual Studio 2015(14)中使用C ++,我使用:

#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;
}

1

我想使用C ++ 11答案,但是我不能,因为GCC 4.9不支持std :: put_time。

GCC中的std :: put_time实施状态?

我最终使用一些C ++ 11稍微改善了非C ++ 11的答案。对于无法使用GCC 5的用户,但仍希望使用其日期/时间格式的C ++ 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());
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.