업데이트 :이 기능은 Template Toolkit Plugin에서 구현처럼 같습니다. 나는 나머지 부분을 참조 용으로 남겨두고 있지만, Template::Plugin::DtFormatter은 볼만한 장소 일 것이다.
해당 모듈의 소스 코드를 보면, 나는 당신이 원하는 것과 관련된 것으로 보이는 DateTime::Format::Natural으로 연결되었습니다.
이전 답변 : Date::Calc에
봐는 Delta_DHMS
를 사용하여 당신에게 델타를 제공합니다. 당신은 그 델타를 사용하여 당신이 날짜로 어떻게 말할 것인지를 선택할 수 있어야합니다.
아주 기본적인 출발점입니다. 그것은 버그이지만 기본 아이디어를 설명합니다. 맛에 논리를 추가하십시오.
#!/usr/bin/perl
use strict;
use warnings;
use Date::Calc qw(:all);
use Lingua::EN::Inflect qw(NO);
my @dates = (
[ 2009, 7, 6 ],
[ 2009, 7, 30 ],
[ 2009, 7, 9 ],
[ 2009, 7, 9, 12, 32 ],
[ 2009, 7, 12, 5, 43 ],
[ 2009, 7, 3, 5, 14 ],
[ 2010, 8, 9 ],
[ 2012, 8, 9 ],
[ 2013, 8, 9 ],
);
for my $date (@dates) {
print "@$date: ", relative_when($date), "\n";
}
sub relative_when {
my ($year, $month, $day, $hour, $min, $sec) = @{ $_[0] };
my ($Dyear, $Dmon, $Dday, $Dhr, $Dmin, $Dsec) = Delta_YMDHMS(
Today_and_Now(),
$year, $month, $day, $hour || 0, $min || 0, $sec || 0
);
return NO('year', $Dyear) if $Dyear > 0;
return NO('month', $Dmon) if $Dmon > 0;
return NO('week', int($Dday/7) if $Dday > 6;
return NO('day', $Dday) if $Dday > 1;
return 'tomorrow' if $Dday == 1;
return 'today' if $Dday == 0;
return "";
}
__END__
출력 : 트위터 팬 위키에 Relative Time Scripts에서
C:\Temp> dfg
2009 7 6:
2009 7 30: 2 weeks
2009 7 9: today
2009 7 9 12 32: today
2009 7 12 5 43: 2 days
2009 7 3 5 14:
2010 8 9: 1 year
2012 8 9: 3 years
2013 8 9: 4 years
어? 왜 downvote? –
알아, 맞지? 사람들은이 사이트에서 어떤 것도 downvote 것입니다. 의미 할 필요가 없습니다! – mcandre