2011-09-27 90 views
1
$a = "Sat Aug 04 23:59:59 GMT 2012" 

如何找到那是$a是100天大?如何找到當天和輸入日期之間的天差

我不能使用任何額外的Perl模塊,因爲我不能在所有的主機

+0

就可以完成的那句話,「我不能使用任何額外的Perl模塊*,因爲* ......」? – Johnsyweb

+1

我不能在所有主機上安裝模塊。 – joe

+0

如果你不能安裝CPAN模塊,那麼你不用Perl編程。你應該首先解決這個問題。 –

回答

1

如果可用,您應該使用DateTime,但如果不可用,則下面應該做。真的, 在這個階段,你應該滾動你自己的日期邏輯,但它仍然是非常容易使用核心模塊POSIX

use strict; 
use warnings; 
use POSIX(); 

# get a list of month symbols 
my @mons = qw/Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec/; 

# Create a symbol -> number table 
my %num_for 
    = do { 
     my $mon = 0; 
     map { $_ => $mon++ } @mons; 
    }; 

# Create the alternation of months 

# Create line regex 
my $time_rex 
    = qr/ (${\join('|', @mons)}) 
      \s+ 
      0? (\d+) 
      \s+ 
      (\d{2}) : (\d{2}) : (\d{2}) 
      \s+ 
      # I made the tz optional to handle scalar(localtime) 
      (?: (\p{alpha}+) \s+)? 
      (\d{4}) 
     /x 
    ; 
... 

# Convienience function 
sub get_time_value { 
    # parse date string 
    return unless my @fields = (shift =~ /$time_rex/); 
    # get numerical month 
    $fields[0] = $num_for{ $fields[0] }; 
    # perl year kludge 
    $fields[-1] -= 1900; 
    return wantarray ? @fields[ 4, 3, 2, 1, 0, 6, 5 ] 
     :    POSIX::mktime(@fields[ 4, 3, 2, 1, 0, 6 ]) 
     ; 
} 

sub days_prior_to_now { 
    return unless defined(my $days_prior = shift); 
    return time unless $days_prior; 

    $days_prior = - $days_prior if $days_prior < 0; 
    my $date_string = scalar(localtime); 
    return unless my ($sec, $min, $hr, $day, $mon, $year, $tz) 
      = get_time_value($date_string) 
      ; 
    return POSIX::mktime($sec, $min, $hr, $day - $days_prior, $mon, $year); 
} 

sub is_100_days_before_now { 
    my $a_string = shift; 

    croak "Could not parse '$a_string'!" 
     unless my $a_value = get_time_value($a_string); 
    return $a_value < days_prior_to_now(100); 
} 

if (is_100_days_before_now($a)) { 
    ... 
} 
1

安裝首先,你必須分析在DateTime對象的字符串,使用DateTime::Format::Builder,建立一個自定義字符串解析器。然後你就可以得到兩個與的區別:

$dt->delta_days($datetime); 

其中$ DT是從字符串解析DateTime對象,$日期時間爲參考(另一個DateTime對象)。

+1

或者,您可以使用[Date :: Parse](http://p3rl.org/Date::Parse)來解析該字符串,然後使用'from_epoch'來構造DateTime對象。 – oylenshpeegul

1

如果你得到了你的模塊的恐懼,Date::Calc將使這短暫的工作:

$ perl -MDate::Calc=Delta_Days,Parse_Date,Today -E 'say Delta_Days(Today, Parse_Date(shift))' "Sat Aug 04 23:59:59 GMT 2012" 
312 
1

有標準Perl安裝提供了很多的日期時間模塊,這意味着沒有必要安裝任何東西。因爲Perl版本3.X這個模塊已經以某種形式被查閱:

這裏有其他人在5.8版本:

的Perl的較新版本包括:

可以使用perldoc命令來查看哪些模塊已安裝:

C:> perldoc -l Time::Piece 
C:\Perl\lib\Time\Piece.pm 

Unix的存儲時間的數從1970年1月1日的「The Epoc」開始,Perl和Perl做了相同的事情(甚至在Windows上)。因此,一旦將日期轉換爲Perl時間,您可以簡單地減去8,640,000這是100天內的秒數。 (100天* 24小時/天* 60分鐘/小時* 60秒/分鐘),然後將其轉換回字符串。

在非常非常基本的層面上,您可以使用Perl中的gmtime函數和Local :: Time模塊中的timegm來完成此操作。

其他模塊可以很簡單地將時間從格式轉換爲另一種格式,甚至可以進行一些數學計算。我最喜歡的是Time::Piece,它允許你使用strptime格式來快速轉換你的時間格式,然後你可以使用epoc成員函數將時間轉換回秒,減去8,640,000,並重新轉換成串。

0

如果時間::片芯的Perl版本:

use strict; 
use warnings; 

use Time::Piece; 
use Time::Seconds qw(ONE_DAY); 

my $t = "Sat Aug 04 23:59:59 GMT 2012"; 
my $dt = Time::Piece->strptime($t, "%a %b %d %T %Z %Y"); 

my $day_str = $dt->strftime("%F"); 
my $day = Time::Piece->strptime($day_str, "%Y-%m-%d") + 100.5*ONE_DAY(); 

print $day->strftime("%F"),"\n"; 
相關問題