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
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
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);
Che cosa sono lo svp e il parser? – q0987
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
[mktime] (http://en.cppreference.com/w/cpp/chrono/c/mktime): _I valori nel tempo possono essere al di fuori dei loro intervalli normali_ –
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
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";
Tieni presente che 'strptime()' è un'estensione non standard che non è disponibile su tutti i sistemi (incluso Windows). – spencercw
@spencercw: Infatti. Esistono, tuttavia, implementazioni open source per la maggior parte dei sistemi, incluso Windows. Inoltre, è uno standard di POSIX. :) – netcoder
Sembra non funzionare su date come Feb-31-2016. – blackpen
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;
E a proposito di "mm/gg/aaaa" => 02/31/20xx? – NINCOMPOOP
Da dove proviene questo valore? Che cosa è fatto con esso? –
è l'input. Voglio solo controllare se è valido o meno. – MBZ