2009-07-09 2 views
7

정상적인 날짜 시간이 걸리고 적절한 사람이 읽을 수있는 날짜를 만들 수있는 라이브러리 (선호하면 DateTime - esque)가 있는지 알고 싶습니다. 더 일반적인 질문의 본질적으로 반대 : How can I parse relative dates with Perl?.Perl에서 상대 날짜/대략 날짜를 어떻게 만들 수 있습니까?

명백히 정확한 표현/해석은 실제 구현에 달려 있지만, 앞으로 날짜를 지정하는 일관된 방법을 제공하고자합니다. "due in 2 weeks"과 같은 어프로치를 알면 ("나에게)" "due on 2009-07-30"보다 남은 시간을 파악하는 데 더 도움이됩니다.

예 :

2009-07-06  => "in 1 year" 
2009-07-30  => "in 2 weeks" 
2009-07-09  => "tomorrow" 
2009-07-09 12:32 => "tomorrow at 12:32" 
2009-07-12 05:43 => "monday morning" 
2009-07-03 05:74 => "6 days ago" 

답변

7

업데이트 :이 기능은 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 
+0

어? 왜 downvote? –

+0

알아, 맞지? 사람들은이 사이트에서 어떤 것도 downvote 것입니다. 의미 할 필요가 없습니다! – mcandre

관련 문제