2011-08-12 10 views
5

Todo lo que estoy tratando de hacer aquí es si el día o por mes es de un solo dígito, añadir un cero en la parte delantera de la misma. En este momento se imprime la fecha como 201188, y yo estoy buscando 20110808.Fecha :: Calc - formatear el día y el mes

#!/usr/bin/perl 
use Date::Calc qw(Add_Delta_Days); 
my (undef, undef, undef, $day, $month, $year) = localtime(); 
$year +=1900; 
$month +=1; 
($year, $month, $day) = Add_Delta_Days($year, $month, $day, -3) 
if ($month =~ /\d{1}/){ 
    s/$month/0$month/ 
} 
if ($day =~/\d{1}/){ 
    s/$day/0$day/ 
} 
print $year,$month,$day; 
+0

Su sentencias if no tienen sentido. En primer lugar, siempre contendrán un dígito (1 o 2), por lo que las declaraciones if siempre serán verdaderas. En segundo lugar, está realizando una sustitución en la variable '$ _', no' $ month' y '$ day'. – TLP

+0

@TLP, publicó el código que tiene ahora, que no funciona (por las razones que mencionas). Esa es su pregunta. Tu comentario debería ser una respuesta en su lugar. – cjm

+0

en realidad, creo que @TLP señaló algo que necesitaba entender. sobre la instrucción if y la variable $ _ default. – capser

Respuesta

2

if ($ mes < 10)
{
          $ mes = "0 $ meses" ;
}

if ($ < día 10)
{
          $ días = "0 $ días";
}

+0

Sí, creo que esta es una forma sencilla y concisa de hacerlo - gracias – capser

+2

No lo hagas. Si pasa el resultado de esto a otro lugar, Perl saltará nuevamente el cero inicial porque manejará la cadena como un número. Use printf para la impresión formateada. – Olfan

4

Uso printf lugar:

printf "%d-%02d-%02d", $year, $month, $day; 

Da salida como:

C:\perl>perl -we "printf qq(%d-%02d-%02d), 2011,5,4" 
2011-05-04 
C:\perl>perl -we "printf qq(%d-%02d-%02d), 2011,5,12" 
2011-05-12 
C:\perl>perl -we "printf qq(%d-%02d-%02d), 2011,22,12" 
2011-22-12 
+1

Diría que '% 02d' es más idiomático que'% .2d'. –

+0

@Keith Gracias, corregido ahora. – TLP

+0

Y sólo por la simetría, por lo general escribir ' "% 04d-% 02d-% 02d" '. (Un punto menor, y uno que no hace ninguna diferencia real para los años> = 1000.) –

5

Si estás dispuesto a utilizar Date::Calc, por qué no usar DateTime?

use DateTime; 
my $date = DateTime->now; 
$date->subtract(days => 3); 
print $date->ymd; 

De hecho se puede reducir a que:

print DateTime->now->subtract(days => 3)->ymd 
+0

+1 Bonito, debería haber pensado en esto. ;) – TLP

Cuestiones relacionadas