2012-02-24 30 views
8

¿hay alguna función para verificar si una fecha dada es válida o no? No quiero escribir nada desde cero.C++ comprobar si una fecha es válida

p. Ej. 32/10/2012 no es válido y 10/10/2010 es válido

+0

¿De dónde se origina este valor? ¿Qué se hace con eso? –

+0

es la entrada. Solo quiero comprobar si es válido o no. – MBZ

Respuesta

7

Si su cadena está siempre en ese formato, lo más fácil sería dividir la cadena en sus tres componentes, rellenar una estructura tm y pasarlo a mktime(). Si devuelve -1, entonces no es una fecha válida.

También es posible usar Boost.Date_Time a analizarlo:

string inp("10/10/2010"); 
string format("%d/%m/%Y"); 
date d; 
d = parser.parse_date(inp, format, svp); 
+1

¿Qué son svp y analizador? – q0987

+0

mktime normalizará una fecha. Por ejemplo, si el día es negativo, volverá al mes anterior y ajustará los miembros de día y mes en consecuencia. – Cemafor

+1

[mktime] (http://en.cppreference.com/w/cpp/chrono/c/mktime): _Se permite que los valores en el tiempo estén fuera de sus rangos normales_ –

4

La fecha impulso clase de tiempo debe ser capaz de manejar lo que usted requiere. Ver http://www.boost.org/doc/libs/release/doc/html/date_time.html

+1

O la versión actual, http: // www. boost.org/doc/libs/1_48_0/doc/html/date_time.html –

+0

Ahh. Sí, déjame editar mi publicación para reflejar eso. Gracias Fred. – Alikar

+0

O lo que estoy seguro es el enlace de versión actual. :) Gracias Vlad. – Alikar

2

Si el formato de la fecha es constante y que no quieren usar impulso, siempre se puede utilizar strptime, definido en la cabecera ctime:

const char date1[] = "32/10/2012"; 
const char date2[] = "10/10/2012"; 
struct tm tm; 

if (!strptime(date1, "%d/%m/%Y", &tm)) std::cout << "date1 isn't valid\n"; 
if (!strptime(date2, "%d/%m/%Y", &tm)) std::cout << "date2 isn't valid\n"; 
+1

Tenga en cuenta que 'strptime()' es una extensión no estándar que no está disponible en todos los sistemas (incluido Windows). – spencercw

+1

@spencercw: De hecho. Sin embargo, hay implementaciones de código abierto para la mayoría de los sistemas, incluido Windows. Además, es un estándar de POSIX. :) – netcoder

+2

Parece que no funciona en fechas como Feb-31-2016. – blackpen

0

Si las barras se insertan mediante programación (Asumo que sí, ya que supones que siempre estarán ahí.), Probablemente sería mejor validar el mes, el día y el año por separado. Por ejemplo:

if ((month < 1) || (month > 12)) return false; 
+1

¿Qué hay de "mm/dd/aaaa" => 02/31/20xx? – NINCOMPOOP

Cuestiones relacionadas