2016-10-27 4 views
1

저는 Perl에서 상당히 새롭습니다. 나는이 형식Perl이 두 날짜를 뺍니다.

15.07.16 23:13:34 
15.07.16 20:04:24 

내가 날짜 개체에서이 문자열을 변환 할 필요가 있음을 알고 두 날짜를 빼기 위해 노력하고 있어요. 내 문제는 추가 패키지를 설치하지 않고 기본 perl로 제한됩니다. 그것을 할 수있는 방법이 있습니까?

내 버전은 v5.8.4이고 출력은 03:09:10이어야합니다.

+1

어떤 Perl 버전을 보유하고 있습니까? 출력으로 기대하는 것은 무엇입니까? 당신은 당신의 질문을 편집 할 수 있습니다. – simbabque

+1

링크 된 복제는 기본적으로 원하는 것입니다. 'strptime '의 패턴은 약간 다릅니다. 올바른 패턴을 구성하는 방법은 http://man7.org/linux/man-pages/man3/strptime.3.html을 참조하십시오. – simbabque

+1

내 버전은 v5.8.4이고 출력은 03:09:10 – dermont

답변

4

당신은 Perl 5.8.4를 사용하고 있다고 말합니다. CPAN 모듈을 설치하고 업데이트해야합니다.

그러나 여기는 5.8.4에서 사용 가능한 핵심 Perl 기능 만 사용하여 원하는 작업을 수행하는 방법입니다.

#!/usr/bin/perl 

use strict; 
use warnings; 
use Time::Local; 

my $date1 = '15.07.16 23:13:34'; 
my $date2 = '15.07.16 20:04:24'; 

my $diff = date2sec($date1) - date2sec($date2); 

print secs2duration($diff); 

sub date2sec { 
    my ($date) = @_; 

    my ($day, $mon, $yr, $hr, $min, $sec) = split(/[. :]/, $date); 

    # I've assumed that your timestamps are in your local timezone, 
    # so I've used timelocal() here. If your timestamps are actually 
    # UTC, you should use timegm() instead. 
    return timelocal($sec, $min, $hr, $day, $mon-1, 2000 + $yr); 
} 

sub secs2duration { 
    my ($secs) = @_; 

    my $hours = int($secs/(60*60)); 
    $secs %= (60*60); 
    my $mins = int($secs/60); 
    $secs %= 60; 

    return sprintf '%02d:%02d:%02d', $hours, $mins, $secs; 
} 
+0

반대로 듣지 않고도, 나는 현지 시간으로 간주하지 않을 것이다. (그래서 timelocal 대신에 timegm이다.) – ysth

+0

@yst : 나의 경험상 시간대에 대해 언급하지 않는 사람들은 로컬 시간 - 그래서 나는'timelocal()'을 선택했다. 하지만이를 명확히하기 위해 의견을 추가하겠습니다. –

+0

델타를 찾고 있기 때문에 시간대는 중요하지 않습니다. 중요한 것은 두 입력이 모두 동일한 시간대에 있다는 것입니다. 우리는 다음과 같이 가정 할 수밖에 없습니다 : – ardavey

관련 문제