Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

709
Views
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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!