Perl에서 날짜/시간을 에포크 시간(1970년 이후의 유닉스 시간/초)으로 어떻게 변환합니까?

StackOverflow https://stackoverflow.com/questions/95492

문제

(년, 월, 일, 시, 분, 초) 배열로 날짜/시간이 주어지면 이를 에포크 시간(예: 1970-01-01 00:00:00 GMT 이후의 초 수)으로 어떻게 변환합니까? ?

보너스 질문:날짜/시간이 문자열로 주어지면 먼저 어떻게 (y,m,d,h,m,s) 배열로 구문 분석합니까?

도움이 되었습니까?

해결책 2

이것은 유닉스 시간을 얻는 가장 간단한 방법입니다:

use Time::Local;
timelocal($second,$minute,$hour,$day,$month-1,$year);

인수의 역순과 1월이 0월이라는 점에 유의하세요.더 많은 옵션을 보려면 다음을 참조하세요. 날짜 시간 CPAN의 모듈.

구문 분석에 대해서는 다음을 참조하세요. 날짜::분석 CPAN의 모듈.날짜 구문 분석에 대해 정말 자세히 알고 싶다면 날짜::마닙 도움이 될 수 있지만 자체 문서에서는 많은 수하물을 운반하므로(예: 일반적인 비즈니스 휴일 등을 알고 있음) 다른 솔루션이 훨씬 빠르기 때문에 사용하지 말 것을 경고합니다.

구문 분석할 날짜/시간의 형식에 대해 알고 있는 경우 간단한 정규식으로 충분할 수 있지만 적절한 CPAN 모듈을 사용하는 것이 더 나을 것입니다.예를 들어 날짜가 항상 YMDHMS 순서라는 것을 알고 있다면 CPAN 모듈을 사용하세요. 날짜시간::형식::ISO8601.


내 자신의 참고로, 아래는 날짜가 항상 "HMS" 부분의 전체 또는 일부가 선택 사항인 YMDHMS 순서로 표시되는 응용 프로그램에 사용하는 함수입니다.모든 구분 기호(예: "2009-02-15" 또는 "2009.02.15")를 허용합니다.해당 유닉스 시간(1970-01-01 00:00:00 GMT 이후의 초) 또는 구문 분석할 수 없는 경우 -1을 반환합니다. 즉, 1969년 날짜를 합법적으로 구문 분석할 필요가 전혀 없다는 것을 확인하는 것이 좋습니다. 12-31 23:59:59).또한 "69"까지의 두 자리 연도 XX는 "20XX"를 의미하고, 그렇지 않으면 "19XX"를 의미한다고 가정합니다(예: "50-02-15"는 2050-02-15를 의미하지만 "75-02-15"는 1975-1975-를 의미함). 02-15).

use Time::Local;

sub parsedate { 
  my($s) = @_;
  my($year, $month, $day, $hour, $minute, $second);

  if($s =~ m{^\s*(\d{1,4})\W*0*(\d{1,2})\W*0*(\d{1,2})\W*0*
                 (\d{0,2})\W*0*(\d{0,2})\W*0*(\d{0,2})}x) {
    $year = $1;  $month = $2;   $day = $3;
    $hour = $4;  $minute = $5;  $second = $6;
    $hour |= 0;  $minute |= 0;  $second |= 0;  # defaults.
    $year = ($year<100 ? ($year<70 ? 2000+$year : 1900+$year) : $year);
    return timelocal($second,$minute,$hour,$day,$month-1,$year);  
  }
  return -1;
}

다른 팁

당신이 사용하는 경우 날짜 시간 모듈에서 다음을 호출할 수 있습니다. 시대() DateTime 객체의 메서드입니다. 왜냐하면 이것이 여러분이 유닉스 시간이라고 생각하는 것이기 때문입니다.

DateTimes를 사용하면 epoch에서 날짜 객체로 매우 쉽게 변환할 수 있습니다.

대안적으로, 현지 시각 gmtime은 epoch를 월, 연도, timelocal 및 timegm을 포함하는 배열로 변환합니다. 시간::로컬 모듈 시간 요소 배열(초, 분, ..., 일, 월 등)을 에포크로 변환하는 반대 작업을 수행합니다.

날짜를 구문 분석하려면 다음을 참조하세요. 날짜::분석 CPAN에서.

$ENV{TZ}="GMT";
POSIX::tzset();
$time = POSIX::mktime($s,$m,$h,$d,$mo-1,$y-1900);

나는 이것이 오래된 질문이라는 것을 알고 있지만 다른 답변을 제공하겠다고 생각했습니다.

Time::Piece Perl 5.9.5의 핵심입니다.

이를 통해 임의의 형식으로 시간을 구문 분석할 수 있습니다. strptime 방법.

예:

my $t = Time::Piece->strptime("Sunday 3rd Nov, 1943",
                              "%A %drd %b, %Y");

유용한 부분은 오버로드된 개체이기 때문에 숫자 비교에 사용할 수 있다는 것입니다.

예를 들어

if ( $t < time() ) { #do something }

또는 문자열 컨텍스트에서 액세스하는 경우:

print $t,"\n"; 

당신은 다음을 얻습니다:

Wed Nov  3 00:00:00 1943

다른 유용한 시간 기반 변환을 허용하는 다양한 접근자 메서드가 있습니다. https://metacpan.org/pod/Time::Piece

CPAN에서 날짜::Manip 가져오기, 그 다음에:

use Date::Manip;
$string = '18-Sep-2008 20:09'; # or a wide range of other date formats
$unix_time = UnixDate( ParseDate($string), "%s" );

편집하다:

Date::Manip은 크고 느리지만 구문 분석이 매우 유연하며 순수한 Perl입니다.코드를 작성할 때 서두르고 코드를 실행할 때 서두르지 않을 것이라는 것을 알고 있다면 이 방법을 사용하십시오.

예를 들어시작 시 명령줄 옵션을 한 번 구문 분석하는 데 사용하지만 바쁜 웹 서버에서 많은 양의 데이터를 구문 분석하는 데 사용하지 마십시오.

보다 저자의 의견.

(아래 첫 번째 댓글 작성자에게 감사드립니다)

내가 가장 좋아하는 날짜/시간 파서는 날짜시간::형식::ISO8601 일단 작동하게 되면 epoch()를 사용하여 쉽게 에포크 초로 변환할 수 있는 DateTime 객체를 갖게 됩니다.

CPAN에는 많은 날짜 조작 모듈이 있습니다.내가 특히 좋아하는 것은 날짜 시간 그리고 당신은 strptime 모듈 임의의 형식으로 날짜를 구문 분석합니다.특수한 날짜 형식을 처리하기 위해 CPAN에는 DateTime::Format 모듈도 많이 있지만 strptime이 가장 일반적입니다.

추가 참고로, 예를 들어 적용할 수 있는 하나의 라이너는 다음과 같습니다. !#/bin/sh 스크립트.

EPOCH="`perl -e 'use Time::Local; print timelocal('${SEC}','${MIN}','${HOUR}','${DAY}','${MONTH}','${YEAR}'),\"\n\";'`"

8진수 값은 피하는 것을 기억하세요!

아마도 CPAN의 도움이 있든 없든 '하는 방법은 여러 가지가 있습니다'의 더 나은 예 중 하나일 것입니다.

'날짜/시간'으로 전달되는 내용을 제어할 수 있다면 날짜 시간 특정 Date::Time::Format 하위 클래스를 사용하거나 이상한 날짜 형식을 지원하는 클래스가 없는 경우 DateTime::Format::Strptime을 사용하여 경로를 지정합니다( 날짜/시간 FAQ 상세 사항은).일반적으로 결과에 대해 심각한 작업을 수행하려면 Date::Time을 사용하는 것이 좋습니다.CPAN의 몇몇 수업은 항문 유지력이 뛰어나고 강박적으로 정확합니다.

이상한 자유형을 기대한다면 던져보세요. 날짜::분석의 str2time() 메서드를 사용하면 에포크 이후 초 값을 얻을 수 있으므로 오버헤드 없이 사악한 방법을 사용할 수 있습니다. 날짜::마닙.

다양한 ISO 관련 형식의 날짜를 변환하는 필터(읽은 후 다른 것을 사용하는 사람) 저서 Mighty Kuhn?) 표준 입력의 초 이후 표준 출력 시간은 두 부분을 모두 설명하는 데 도움이 될 수 있습니다.

martind@whitewater:~$ cat `which isoToEpoch`
#!/usr/bin/perl -w
use strict;
use Time::Piece;
# sudo apt-get install libtime-piece-perl
while (<>) {
  # date --iso=s:
  # 2007-02-15T18:25:42-0800
  # Other matched formats:
  # 2007-02-15 13:50:29 (UTC-0800)
  # 2007-02-15 13:50:29 (UTC-08:00)
  s/(\d{4}-\d{2}-\d{2}([T ])\d{2}:\d{2}:\d{2})(?:\.\d+)? ?(?:\(UTC)?([+\-]\d{2})?:?00\)?/Time::Piece->strptime ($1, "%Y-%m-%d$2%H:%M:%S")->epoch - (defined ($3) ? $3 * 3600 : 0)/eg;
  print;
}
martind@whitewater:~$ 

단지 명령줄 유틸리티(즉, 다른 함수에서 호출되는 유틸리티가 아닌)를 찾고 있다면 이 스크립트를 사용해 보세요.GNU 날짜(거의 모든 Linux 시스템에 존재)가 있다고 가정합니다.

#! /usr/bin/perl -w

use strict;

$_ = (join ' ', @ARGV);
$_ ||= <STDIN>;

chomp;

if (/^[\d.]+$/) {
    print scalar localtime $_;
    print "\n";
}
else {
    exec "date -d '$_' +%s";
}

작동 방식은 다음과 같습니다.

$ Time now
1221763842

$ Time yesterday
1221677444

$ Time 1221677444
Wed Sep 17 11:50:44 2008

$ Time '12:30pm jan 4 1987'
536790600

$ Time '9am 8 weeks ago'
1216915200
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top