2011-12-30 15 views

Odpowiedz

4

Jednym ze sposobów jest użycie Date::Simple:

use warnings; 
use strict; 
use Date::Simple qw(d8); 

my $d = d8('20111230'); 
print $d->format('%d-%b-%Y'), "\n"; 

__END__ 

30-Dec-2011 
2

Oto inne rozwiązanie. Wykorzystuje DateTimeX::Easy:

#!/usr/bin/env perl 

use strict; 
use warnings; 

use DateTimeX::Easy; 

my $dt = DateTimeX::Easy->parse('20111230'); 
print lc $dt->strftime('%d-%b-%G'); 
5

Jeśli nie można użyć jednego z modułów data, POSIX nie jest tak źle, a chodzi o perl:

use v5.10; 
use POSIX qw(strftime); 

my $date = '19700101'; 

my @times; 
@times[5,4,3] = $date =~ m/\A(\d{4})(\d{2})(\d{2})\z/; 
$times[5] -= 1900; 
$times[4] -= 1; 

# strftime(fmt, sec, min, hour, mday, mon, year, wday = -1, yday = -1, isdst = -1) 
say strftime('%d-%b-%Y', @times); 

Making @times jest nieco brzydki. Nie zawsze możesz dostać to, czego chcesz, ale jeśli spróbujesz czasami, może się okazać, że dostaniesz to, czego potrzebujesz.

+0

+1 dla POSIX i cytowanie kamieni. – TLP

7

Zgodnie z TMTOWTDI, można użyć Time::Piece

#!/usr/bin/env perl 
use strict; 
use warnings; 
use Time::Piece; 
my $t = Time::Piece->strptime("20111230", "%Y%m%d"); 
print $t->strftime("%d-%b-%Y\n"); 
+5

Czas :: Kawałek jest również dostarczany z Perłem, począwszy od wersji 5.10. –

3

szybkie rozwiązanie.

my $date = '20111230'; 
my @months = (
    'Jan','Feb','Mar','Apr', 
    'May','Jun','Jul','Aug','Sep', 
    'Oct','Nov','Dec' 
); 

if($date =~ m/^(\d{4})(\d{2})(\d{2})$/){ 
     print $3 . '-' . $months[$2-1] . '-' . $1; 
} 
+0

Ten nie wymaga pakietów, które nie znajdują się w podstawowej instalacji PERL i działa. – boatcoder