Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

698
Vistas
C# a C++: convertir el cálculo de tiempo de C# a crono de C++

Tengo la tarea de convertir un código C# a C++ y tengo problemas con Chrono. El objetivo es redondear un tiempo a un lapso de tiempo variable.

C#:

 int iRoundTo = 30; // can be 45 or other variable value, not a const DateTime dt = Floor(DateTime.Now, new TimeSpan(0, 0, 0, iRoundTo));

Encontré una solución con const iRoundTo pero esto no es lo que estoy buscando. ¿Cómo convierto esto a C++ usando std::chono?

C++:

 std::chrono::seconds diff(iRoundTo); auto dt = std::chrono::floor<diff>(Now);

Esto no funciona debido a un error de compilación.

Gracias.

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Estoy adivinando un poco con esta respuesta, pero supongo que desea truncar la hora actual al piso del medio minuto actual (en el caso de iRoundTo == 30 ).

Si no me equivoco, esto es fácil de hacer siempre que iRoundTo sea una constante de tiempo de compilación.

 #include <chrono> #include <iostream> int main() { using RoundTo = std::chrono::duration<int, std::ratio<30>>; auto Now = std::chrono::system_clock::now(); auto dt = std::chrono::floor<RoundTo>(Now); std::cout << dt << '\n'; }

Lo anterior crea un nuevo tipo de duración de 30 segundos. Luego obtiene la hora actual y la baja (trunca hacia abajo) a la unidad de medio minuto anterior. Luego imprime el resultado. Todo antes de la impresión funciona en C++17. La impresión (la última línea) requiere C++20.

Salida de ejemplo para mí:

 2022-01-18 01:45:30

El código anterior también puede funcionar antes de C++17, pero en ese caso deberá encontrar su propio floor (por ejemplo , date.h ) o usar std::chrono::duration_cast que se trunca hacia cero.

Actualizar

En los comentarios a continuación, se explica que iRoundTo no es una constante de tiempo de compilación, pero siempre representa un múltiplo de segundos. En este caso lo haría en dos pasos:

 int iRoundTo = 30; auto Now = std::chrono::system_clock::now(); // First truncate to seconds auto dt = std::chrono::floor<std::chrono::seconds>(Now); // Then subtract of the modulus according to iRoundTo dt -= dt.time_since_epoch() % iRoundTo;

La dt.time_since_epoch() % iRoundTo tiene el tipo seconds y un valor entre 0s y seconds{iRoundTo} - 1s .

over 4 years ago · Santiago Trujillo Denunciar

0

Sin acceso a las herramientas más nuevas (y tanto el formato std::format como << la sobrecarga parecen requerir herramientas bastante nuevas), lo he probado solo hasta ahora (edítelo si puede probarlo más):

 #include <chrono> #include <iostream> #include <ctime> #include <iomanip> //#include <format> int main() { int roundTo = 15; auto dt = std::chrono::floor<std::chrono::seconds> (std::chrono::system_clock::now()); dt -= dt.time_since_epoch() % roundTo; std::time_t t = std::chrono::system_clock::to_time_t(dt); std::cout << std::ctime(&t); // Using <ctime> std::cout << std::put_time(std::localtime(&t), "%Y-%m-%e %H:%M:%S") << '\n'; // Using <iomanip> //std::cout << "date: " << std::format("%Y-%m-%e %H:%M:%S", dt) << '\n'; // Using <format> //std::cout << "date: " << std::format("{%Y-%m-%e %H:%M:%S}", dt) << '\n'; // Using newer <format> //std::cout << dt << '\n'; // Using << overload }
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda