São portanto bissextos:
Os múltiplos de 4 e não múltiplos de 100: 1996, 2004, 2008 e 2012
Os múltiplos de 400: 1600, 2000, 2400
Não são bissextos:
Os múltiplos de 100 e não de 400: 1700, 1800, 1900 e 2100
agradecia que alguem que tivesse uma expressão regular que fize-se:
deterctar anos bisextos
dias do mês (31,30)dias
validação de datas nos formato dd-mm-yyyy
#!/usr/bin/perl
# ficheiro: regex_datas.pl
use strict;
use warnings;
#
# para este exercício só aceito datas entre 1900 e 2099
# utilizei o formato dd-mm-aaaa
#
my @datas = (
'1-3-2007', # OK
'29-2-2008', # OK, ano bissexto
'29-2-2000', # OK, ano bissexto
'25-9-2008', # OK
'31-3-2008', # OK
'31-4-1999', # NOT OK, dia invalido
'26-10-1899', # NOT OK, ano < 1900
'26-13-1505', # NOT OK, mes invalido e ano < 1900
'36-10-2011', # NOT OK, dia invalido
'26-13-2001', # NOT OK, mes invalido
'30-2-1980', # NOT OK, dia invalido
'0-2-1980', # NOT OK, dia invalido
'29-2-1900', # NOT OK, ano nao bissexto
'12-("&$%"(%"/("%$("&$##/("#' # NOT OK!
);
foreach my $data (@datas) {
print $data, $data =~ m+^
(0?[1-9]|[12][0-9]|3[01])
[- /.]
(0?[1-9]|1[012])
[- /.]
(19|20)\d\d
(??{$1 == 31 and (
$2 == 4 or $2 == 6 or $2 == 9 or $2 == 11
)})
(??{$1 >= 30 and $2 == 2})
(??{$2 == 2 and $1 == 29 and not
($3 % 4 == 0 and
($3 % 100 != 0 or $3 % 400 == 0)
)})
$+gx ? qq|\tCERTO!\n| : qq|\tERRADO!\n|;
}
[me@mybox] ~/Perl: perl regex_datas.pl
1-3-2007 CERTO!
29-2-2008 CERTO!
29-2-2000 CERTO!
25-9-2008 CERTO!
31-3-2008 CERTO!
31-4-1999 ERRADO!
26-10-1899 ERRADO!
26-13-1505 ERRADO!
36-10-2011 ERRADO!
26-13-2001 ERRADO!
30-2-1980 ERRADO!
0-2-1980 ERRADO!
29-2-1900 ERRADO!
12-("&$%"(%"/("%$("&$##/("# ERRADO!
$data = '25/2/2007';
//Validar data na variavel $data
if( ($dateTime = strtotime( $data )) == -1 )
echo 'Data incorrecta! :(';
else
echo 'Data certissima! :)';
//O ano na dita data é bissexto?
if( date( 'L', $dateTime ) == 1 )
echo 'Ano bissexto!';
else
echo 'Ano não é bissexto!';
//Quantos dias tem o mês na dita data?
echo 'O mês tem ' . date( 't', $dateTime ) . ' dias!';
Não sei se já conheces este site. Está cheio de exemplos de "profissionais" que fazem as funções mais complicadas "à mão", entre as quais: fazer parse e validar datas, obter ou dividir "partes" de uma string (dados dois indices), validar inteiros (string->int), copiar um ficheiro, remover ou substituir caracteres de uma string, etc etc.@CrazyBomber:
O que o 'alfinete' pediu explicitamente foi uma expressão regular. O código que colocaste não responde à questão original.
A mim não.Não magoei ninguém, pois não?
Eu percebo-te. Porém, a questão aqui não é a da finalidade do código; o 'alfinete' não perguntou qual a melhor forma para fazer isto, ou se uma expressão regular seria adequada para a finalidade, ou etc e tal.Eu perguntei, logo no 3º post da thread, qual era o objectivo deste código.