Escribí una función para obtener una fecha y hora actuales en formato: DD-MM-YYYY HH:MM:SS. Funciona, pero vamos a decir, es bastante feo. ¿Cómo puedo hacer exactamente la misma cosa pero más sencillo?

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;
}
InformationsquelleAutor Katie | 2013-05-03

6 Comentarios

  1. 107

    No C++11 solución: Con el <ctime> encabezado, puede utilizar strftime. Asegúrese de que su buffer es suficientemente grande, no quiere a invadir y causar estragos más tarde.

    #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;
    }
    • Y lo que si se desborda el buffer ? Supongo que debe haber un valor de retorno para strftime que usted necesita para inspeccionar en el código real no ?
    • No toma mucho pensamiento para cualquier formato de cadena para calcular la máxima longitud de la cadena.
    • No entiendo por qué puede pasar rawtime por el valor en la línea 10 de la parte superior, como el tiempo acceps un puntero a un tipo time_t : cplusplus.com/reference/ctime/time En el ejemplo de la página que utiliza el tiempo() de la misma manera que no entiendo. ¿Alguien puede explicar a mí esto?
    • Hay un & allí. Eso significa que en lugar de los contenidos de la rawtime variable, es la dirección en la memoria se pasa… que es lo que se almacena en una variable puntero.
    • Para obtener milisegundos: auto ahora = std::chrono::system_clock::now(); std::chrono::time_point<std::chrono::system_clock> época; int ms = std::chrono::duration_cast<std::chrono::milisegundos>(ahora – epoch).count() % 1000;
    • Lamentablemente, esta función devuelve 0 y no el formato de la fecha y la hora correctamente en Windows 10. (Al menos para mí).

  2. 132

    Desde C++11 podría utilizar std::put_time de iomanip encabezado:

    #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 es una secuencia de manipulador, por lo tanto, podría ser utilizado junto con std::ostringstream con el fin de convertir la fecha a una cadena:

    #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;
    }
    • std::put_time que aún falta en gcc 4.9.
    • gcc 5.0 tiene, pero no las versiones anteriores.
    • Tengo una pregunta. En mi código, tengo una función que se supone para devolver un tiempo. Cuál debe ser el tipo de retorno de una función, que devuelve la hora actual?
    • depende. Usted puede devolver el tiempo en formato Unix, Impulsar la fecha Local del tiempo o crear su propio tipo.
    • localtime no es seguro para subprocesos. Considere el uso de localtime_r lugar.
  3. 23

    puede utilizar asctime() en función del tiempo.h para obtener una cadena simple .

    time_t _tm =time(NULL );
    
    struct tm * curtime = localtime ( &_tm );
    cout<<"The current date/time is:"<<asctime(curtime);

    Ejemplo de salida:

    The current date/time is:Fri Oct 16 13:37:30 2015
    • No, usted no puede: asctime no entregar el formato de fecha/hora se pide en la pregunta!
    • Mientras que no es así, te da tiempo en una cadena. El código es limpio y conciso.
    • Limpia y concisa código no ayuda si no lo que uno quiere o necesita. Quiero un camión (string), consigue uno. Que desean para el transporte de líquidos, usted necesita un camión cisterna y no ser feliz de llegar a un camión de basura…
    • Bonita respuesta, pero asctime() tiene la mala idea de devolver un LF Cadena terminada en…
    • Además asctime no es sensible a la localidad como strftime es.
  4. 3

    Con C++ en MS Visual Studio 2015 (14), uso:

    #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;
    }
  5. 1

    Quería usar el C++11 respuesta, pero yo no podía porque GCC 4.9 no admite std::put_time.

    std::put_time estado de la aplicación en el GCC?

    Terminé usando un poco de C++11 a mejorar un poco el no-C++11 de respuesta. Para aquellos que no pueden usar GCC 5, pero aún así un poco de C++11 en su formato de fecha/hora:

     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());
  6. 0
    std::time_t ct = std::time(0);
    char* cc = ctime(&ct);
    • Gracias por este fragmento de código, que podría proporcionar cierta ayuda inmediata. explicación adecuada, mejoraría mucho su valor de largo plazo demostrando por qué es una buena solución para el problema y sería más útil para los lectores futuros con otras preguntas similares. Por favor, editar su respuesta a añadir alguna explicación, incluyendo las suposiciones que hemos hecho, como #includes.
    • ¿Qué significa esto realmente retorno?

Dejar respuesta

Please enter your comment!
Please enter your name here