pseint programa para meses los fechas entre diferencia dias contador comparar calcular bisiestos años año algoritmo c++ date date-arithmetic

para - programa de fechas en c++



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

Convierta sus fechas a números enteros que denoten el número de días desde una época y luego reste. En este ejemplo, elegí Rata Die , se puede encontrar una explicación del algoritmo 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);

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 manera

#include <iostream> #include <ctime> 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 del autor original


Nueva respuesta para una vieja pregunta:

Usando esta biblioteca de fechas de solo encabezado de C ++ 11 / C ++ 14 , ahora puede escribir:

#include "date.h" #include <iostream> 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 fechas anterior. Se encuentran en este documento: Algoritmos de fecha de bajo nivel compatibles con el cronógrafo . El algoritmo de este documento que se está ejercitando en este ejemplo es el siguiente:

// Returns number of days since civil 1970-01-01. Negative values indicate // days prior to 1970-01-01. // Preconditions: y-m-d 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<Int>::min()/366, numeric_limits<Int>::max()/366] // Exact range of validity is: // [civil_from_days(numeric_limits<Int>::min()), // civil_from_days(numeric_limits<Int>::max()-719468)] template <class Int> constexpr Int days_from_civil(Int y, unsigned m, unsigned d) noexcept { static_assert(std::numeric_limits<unsigned>::digits >= 18, "This algorithm has not been ported to a 16 bit unsigned integer"); static_assert(std::numeric_limits<Int>::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<unsigned>(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<Int>(doe) - 719468; }

Consulte Algoritmos de fecha de bajo nivel compatibles con el crono para obtener detalles sobre cómo funciona este algoritmo, las pruebas de unidad para este y su rango de validez.

Este algoritmo modela el calendario gregoriano proleptico , 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 haya configurado otros calendarios y sincronizados con la misma época en serie (estos algoritmos usan el Gregoriano 1970-01-01, 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, pero también entre dos calendarios que haya modelado.

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

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

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

Si le preocupan las zonas horarias, se escribe una biblioteca de zona horaria adicional (separada) en la parte superior de la biblioteca de fechas para manejar las zonas horarias utilizando la base de datos de zona horaria de la IANA . Si es necesario, la biblioteca de zona horaria también tiene una facilidad para los cálculos que incluyen segundos de salto .


Para evitar realizar su propia función, puede usar date_time desde Boost.