2010-03-21 3 views
3

"yyyy-MM-ddTHH:mm:ssZ" 형식의 문자열 속성을 가진 수천 개의 개체가 있습니다. 이 객체들을 시간순으로 정렬하고 싶습니다.어떻게 Perl에서 타임 스탬프를 정렬 할 수 있습니까?

유용한 패키지 또는 스크립트가 있습니까?

"(현재 난 그냥 개별 숫자 값을 비교하고 있는데 매우 효율적이고 깔끔한없는 것 같다.)

+0

TTT 값, MM 값 등을 비교한다는 뜻입니까? 그렇다면 실제로 전체 문자열을 타임 스탬프 값으로 변환해야합니다. – kriss

답변

3

Time :: Local을 사용하여 날짜를 타임 스탬프로 변환하거나 cpan의 Date :: modules 중 하나를 변환 할 수 있습니다. 사용할 수있는 것을 보려면 this을보십시오.

또한 위의 형식으로 개체를 사전 순으로 정렬하면 트릭을 수행 할 수 있습니다 (숫자를 비교하는 것보다 다소 느리지 만 초기 변환에는 비용이 발생 함).

시간대 및 일광 절약 시간제와 관련된 정렬 문제가 발생할 수 있으므로 전 세계에서 날짜를 사용하는 경우주의하십시오. 모든 datetimes가 괜찮을 것 같은 장소에 있다면.

5

타임 스탬프는 해당 형식에 사전 식 정렬 할 수 있습니다, 그래서 정상적인 펄"종류 "및 문자열 비교 함수 cmp "이면 충분합니다.

+0

@ 스튜어트 : 나는 처음에는 그렇게 생각했지만 시간대 부분 (Z)은 문제를 일으킬 수 있습니까? – kriss

+1

@kriss : 그러나 그것은 마지막 문자이므로 다른 모든 것은 동일 함을 의미합니다. –

+0

@kemp : 예, 그게 문제입니다. 이전에는 동일하지만, 동일한 참조 시간과 관련이없는 경우에는 잘못된 결과를 줄 수 있습니다. – kriss

7

sort 정렬 기능 없이는 사전 식 순서로 정렬됩니다. 그것은 당신의 필요를 충족시킵니다.

@sorted = sort @timestamps; 
+0

나는 그가 날짜순이 아닌 시간순으로 목록을 정렬하려고한다고 생각한다. – Zaid

+0

혼란스럽게 생각합니다. datetime으로 정렬하고 싶습니다. – ablimit

+3

ISO-8601 순서가 타임 존 (예 : Z, Zulu 또는 UTC)의 모든 시간 소인의 주요 장점은 날짜/시간 순서로 영숫자로 정렬 할 수 있다는 것입니다. 처리 할 시간대가 여러 개인 경우 불편합니다 (모든 항목을 UTC로 변환해야합니다.이 작업은별로 쉽지는 않지만 UTC 값을 정렬해야합니다). 그러나 시간대 = 일반적으로 문제. –

0

문자열 형식이 고정되어 있으면 다음 서브 루틴을 사용하여 날짜 목록을 정렬 할 수 있습니다.

sub timeSort { 

    my ($time) = (shift =~ /\d{2}:\d{2}:\d{2}/); 
    return $time; 
} 

my @sortedList = sort { timeSort($a) <=> timeSort($b) } @oldList; 
+0

'shift '를 사용하는 대신'$ _ [0]'이 빠를 수도 있습니다 (정렬을 위해 여러 번 호출되기 때문에). 그렇지 않으면 그게 내가 그렇게 할 수있는 방법이야. –

관련 문제