回答
如果可用,您應該使用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)) {
...
}
安裝首先,你必須分析在DateTime
對象的字符串,使用DateTime::Format::Builder,建立一個自定義字符串解析器。然後你就可以得到兩個與的區別:
$dt->delta_days($datetime);
其中$ DT是從字符串解析DateTime
對象,$日期時間爲參考(另一個DateTime
對象)。
或者,您可以使用[Date :: Parse](http://p3rl.org/Date::Parse)來解析該字符串,然後使用'from_epoch'來構造DateTime對象。 – oylenshpeegul
如果你得到了你的模塊的恐懼,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
有標準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,並重新轉換成串。
如果時間::片芯的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";
- 1. 日期時間和日期格式之間的差異天數
- 2. 找到日期之間的天數C#
- 3. 找到2日期之間的天數?
- 4. 兩個日期之間的天差
- 5. 獲取今天的日期和上一天之間的天數差異
- 6. Android中當前日期和輸入日期之間的差異
- 7. 兩天之間的天差
- 8. 計算入學日期和今天之間的天數
- 9. 日期之間的天數
- 10. 如何查找日期的當天
- 11. 入門日期的當天
- 12. 如何在DatePickerDialog上的當前日期和前7天之間啓用日期?
- 13. 如何找到天的兩個日期
- 14. 如何計算「入住日期」和「結帳日期」之間的天數?
- 15. PYTHON:輸入今天之後的天數,顯示未來的一天的日期
- 16. 根據當天的日期和時間每天更改文本
- 17. 兩個用戶輸入日期之間的天數
- 18. Zend的日期 - 天差
- 19. 如何查找兩個日期之間的天數?
- 20. 需要加入日期和今天的年,月,日格式日期間計算天的差異
- 21. 如何用靜態時間計算當前時間和昨天日期之間的時間差
- 22. 如何獲取上次星期一到當天之間的日期?
- 23. 日期時間差只返回天數?
- 24. 如何獲得給定日期和之前記錄日期之間的天數?
- 25. 我如何得到兩天之間在java中的日期差異
- 26. 加入今天和明天的日期盈我的日期
- 27. 2天之間的差異
- 28. 如何讓用戶輸入選定的房間並通過兩個日期之間的天數差異倍數?
- 29. HTML5輸入類型日期禁用日期今天之前
- 30. 如何獲取我輸入的每一行中最早的日期和最早的日期之間的天數
就可以完成的那句話,「我不能使用任何額外的Perl模塊*,因爲* ......」? – Johnsyweb
我不能在所有主機上安裝模塊。 – joe
如果你不能安裝CPAN模塊,那麼你不用Perl編程。你應該首先解決這個問題。 –