2012-02-24 36 views
8

c'è qualche funzione per verificare se una determinata data è valida o no? Non voglio scrivere nulla da zero.C++ controlla se una data è valida

ad es. 32/10/2012 non è valido e 10/10/2010 è valido

+0

Da dove proviene questo valore? Che cosa è fatto con esso? –

+0

è l'input. Voglio solo controllare se è valido o meno. – MBZ

risposta

7

Se la stringa è sempre in tale formato, la cosa più semplice da fare sarebbe dividere la stringa nei suoi tre componenti, compilare una struttura tm e passarlo a mktime(). Se restituisce -1, allora non è una data valida.

Si potrebbe anche usare Boost.Date_Time di analizzarlo:

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

Che cosa sono lo svp e il parser? – q0987

+0

mktime normalizzerà una data. Ad esempio, se il giorno è negativo, si riavvolgerà al mese precedente e regolerà di conseguenza i membri del giorno e del mese. – Cemafor

+1

[mktime] (http://en.cppreference.com/w/cpp/chrono/c/mktime): _I valori nel tempo possono essere al di fuori dei loro intervalli normali_ –

4

La data spinta classe tempo dovrebbe essere in grado di gestire ciò che si richiede. Vedere http://www.boost.org/doc/libs/release/doc/html/date_time.html

+1

Oppure la versione corrente, http: // www. boost.org/doc/libs/1_48_0/doc/html/date_time.html –

+0

Ahh. Sì, permettimi di modificare il mio post per riflettere questo. Grazie, Fred. – Alikar

+0

O quello che sono sicuro è il collegamento di rilascio corrente. :) Grazie Vlad. – Alikar

2

Se il formato della data è costante e non si desidera utilizzare boost, si può sempre utilizzare strptime, definita nel ctime intestazione:

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

Tieni presente che 'strptime()' è un'estensione non standard che non è disponibile su tutti i sistemi (incluso Windows). – spencercw

+1

@spencercw: Infatti. Esistono, tuttavia, implementazioni open source per la maggior parte dei sistemi, incluso Windows. Inoltre, è uno standard di POSIX. :) – netcoder

+2

Sembra non funzionare su date come Feb-31-2016. – blackpen

0

Se le barre sono inserite programatically (Suppongo di sì, dal momento che si presume che saranno sempre lì.), Sarebbe probabilmente meglio convalidare il mese, il giorno e l'anno separatamente. Ad esempio:

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

E a proposito di "mm/gg/aaaa" => 02/31/20xx? – NINCOMPOOP

Problemi correlati