2011-12-30 29 views

Trả lời

4

Một cách là sử dụng 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

Đây là một giải pháp khác. Nó sử dụng 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

Nếu tôi không thể sử dụng một trong các module ngày, POSIX không phải là quá xấu và nó đi kèm với 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); 

Làm @times là một chút xấu xí. Bạn không thể luôn luôn có được những gì bạn muốn, nhưng nếu bạn thử đôi khi, bạn có thể tìm thấy bạn có được những gì bạn cần.

+0

+1 cho POSIX và trích dẫn đá. – TLP

7

Để phù hợp với TMTOWTDI, bạn có thể sử dụng 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

Time :: Piece cũng đi kèm với Perl, bắt đầu với v5.10. –

3

Một giải pháp nhanh chóng.

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

Điều này không yêu cầu các gói không có trong cài đặt PERL cơ bản và nó hoạt động. – boatcoder

Các vấn đề liên quan