Número de días entre dos fechas C ++

Vi ejemplos para C #, Java, pero para C ++ no puedo encontrar una solución para calcular cuántos días hay entre dos fechas.

Por ejemplo, entre 2012-01-24 y 2013-01-08

¡Gracias!

Esta es una forma.

 #include  #include  int main() { struct std::tm a = {0,0,0,24,5,104}; /* June 24, 2004 */ struct std::tm b = {0,0,0,5,6,104}; /* July 5, 2004 */ std::time_t x = std::mktime(&a); std::time_t y = std::mktime(&b); if ( x != (std::time_t)(-1) && y != (std::time_t)(-1) ) { double difference = std::difftime(y, x) / (60 * 60 * 24); std::cout << std::ctime(&x); std::cout << std::ctime(&y); std::cout << "difference = " << difference << " days" << std::endl; } return 0; } 

mi salida

 Thu Jun 24 01:00:00 2004 Mon Jul 05 01:00:00 2004 difference = 11 days 

Aquí hay una referencia a la publicación original del autor

Convierta sus fechas en números enteros que denotan el número de días desde una época, luego reste. En este ejemplo elegí Rata Die , una explicación del algoritmo se puede encontrar en < http://mysite.verizon.net/aesir_research/date/rata.htm >.

 int rdn(int y, int m, int d) { /* Rata Die day one is 0001-01-01 */ if (m < 3) y--, m += 12; return 365*y + y/4 - y/100 + y/400 + (153*m - 457)/5 + d - 306; } int days = rdn(2013, 1, 8) - rdn(2012, 1, 24); 

Nueva respuesta para una vieja pregunta:

Con esta biblioteca de fechas de solo cabecera C ++ 11 / C ++ 14 , ahora puede escribir:

 #include "date.h" #include  int main() { using namespace date; using namespace std; auto x = 2012_y/1/24; auto y = 2013_y/1/8; cout << x << '\n'; cout << y << '\n'; cout << "difference = " << (sys_days{y} - sys_days{x}).count() << " days\n"; } 

Qué salidas:

 2012-01-24 2013-01-08 difference = 350 days 

Si no desea depender de esta biblioteca, puede escribir la suya, utilizando los mismos algoritmos de fecha que utiliza la biblioteca de fecha anterior. Se encuentran en este documento: Algoritmos de fechas de bajo nivel cronocompatibles . El algoritmo de este documento que se está ejerciendo en este ejemplo es este:

 // Returns number of days since civil 1970-01-01. Negative values indicate // days prior to 1970-01-01. // Preconditions: ymd represents a date in the civil (Gregorian) calendar // m is in [1, 12] // d is in [1, last_day_of_month(y, m)] // y is "approximately" in // [numeric_limits::min()/366, numeric_limits::max()/366] // Exact range of validity is: // [civil_from_days(numeric_limits::min()), // civil_from_days(numeric_limits::max()-719468)] template  constexpr Int days_from_civil(Int y, unsigned m, unsigned d) noexcept { static_assert(std::numeric_limits::digits >= 18, "This algorithm has not been ported to a 16 bit unsigned integer"); static_assert(std::numeric_limits::digits >= 20, "This algorithm has not been ported to a 16 bit signed integer"); y -= m <= 2; const Int era = (y >= 0 ? y : y-399) / 400; const unsigned yoe = static_cast(y - era * 400); // [0, 399] const unsigned doy = (153*(m + (m > 2 ? -3 : 9)) + 2)/5 + d-1; // [0, 365] const unsigned doe = yoe * 365 + yoe/4 - yoe/100 + doy; // [0, 146096] return era * 146097 + static_cast(doe) - 719468; } 

Consulte Algoritmos de fechas de bajo nivel compatibles con crono para obtener detalles sobre cómo funciona este algoritmo, las pruebas de unidades para él y su rango de validez.

Este algoritmo modela el calendario gregoriano proléptico , que extiende el calendario gregoriano indefinidamente, tanto hacia delante como hacia atrás. Para modelar otros calendarios (como el calendario juliano), necesitará otros algoritmos, como los que se muestran aquí . Una vez que tenga otros calendarios configurados y sincronizados con la misma época de serie (estos algoritmos usan 1970-2001 Gregorian, que también es la época del tiempo de Unix ), puede calcular fácilmente el número de días no solo entre dos fechas cualquiera, sino también entre dos calendarios que hayas modelado.

Esto le da la libertad de no tener que codificar en una fecha para el cambio de Julian a Gregorian. Solo tiene que saber a qué calendario se refieren sus datos de entrada.

A veces, las fechas en documentos históricos que de otro modo podrían ser ambiguas se anotan con Estilo antiguo / Nuevo estilo para indicar el calendario juliano o gregoriano, respectivamente.

Si también le preocupa la hora del día con sus fechas, esta biblioteca de misma fecha se integra perfectamente con la biblioteca para usar hours , minutes , seconds , milliseconds , microseconds y nanoseconds , y con system_clock::now() para obtener la fecha y hora actual.

Si le preocupan las zonas horarias, se escribe una biblioteca de zona horaria adicional (por separado) sobre la biblioteca de fechas para gestionar las zonas horarias utilizando la base de datos de la zona horaria IANA . Si es necesario, la biblioteca de la zona horaria también tiene una función para los cálculos que incluyen segundos intercalares .

puedes probar la biblioteca boost date_time

Para evitar hacer su propia función, puede usar date_time de Boost.