Perl Snippets

Perl Unix 타임스탬프 스니펫

time()로 현재 Unix 타임스탬프 가져오기, POSIX::strftime()로 날짜 포맷, Time::Local로 달력 날짜를 에포크 초로 역변환하는 Perl 예제.

Current Unix timestamp (seconds)
my $ts = time();
Current Unix timestamp (milliseconds)
use Time::HiRes qw(time);
my $ms = int(time() * 1000);
Format timestamp as UTC string
use POSIX qw(strftime);
my $str = strftime("%Y-%m-%d %H:%M:%S", gmtime(1700000000));
# "2023-11-15 06:13:20"
Format timestamp as local time string
use POSIX qw(strftime);
my $str = strftime("%Y-%m-%d %H:%M:%S", localtime(1700000000));
Timestamp from date components (UTC)
use Time::Local qw(timegm);
# timegm(sec, min, hour, mday, mon, year)
# mon is 0-indexed: 10 = November
my $ts = timegm(20, 13, 6, 15, 10, 2023);
Timestamp from date components (local)
use Time::Local qw(timelocal);
my $ts = timelocal(20, 13, 6, 15, 10, 2023);
Parse ISO date string to timestamp
use Time::Piece;
my $t = Time::Piece->strptime("2023-11-15T06:13:20Z", "%Y-%m-%dT%H:%M:%SZ");
my $ts = $t->epoch;

Perl 타임스탬프 기본

Perl의 내장 함수 time()은 epoch 이후의 정수 초 수로 현재 Unix 타임스탬프를 반환합니다. 내장 localtime()과 gmtime()은 타임스탬프를 달력 값 목록(초, 분, 시, 일, 월, 연, 요일, 연중 일수, DST 플래그)으로 변환합니다. gmtime/localtime의 월은 0부터 시작(0 = 1월)하고, 연도는 1900년 이후의 연수입니다.

형식화와 파싱

POSIX 모듈은 모든 표준 Perl 설치에 포함되며, C와 동일한 형식 코드로 타임스탬프를 형식화하는 strftime()을 제공합니다. 초 미만 정밀도를 위해 Time::HiRes(Perl 5.8부터 코어에도 포함)는 time()과 sleep()을 재정의하여 부동소수점 값을 받게 합니다. Time::Piece(Perl 5.10부터 코어)는 strptime()을 통한 객체 지향 파싱을 추가합니다.

Perl 운영 참고 사항

Perl의 time()은 네이티브 정수를 반환하므로 64비트 Perl 빌드에서는 2038년 오버플로의 영향을 받지 않습니다. 32비트 Perl 빌드에서는 time_t가 여전히 32비트입니다; Config 모듈의 $Config{ivsize}를 확인하세요. 달력 구성요소로부터 UTC 타임스탬프를 만들 때는 인자를 현지 시각으로 해석하는 timelocal()이 아니라 Time::Local의 timegm()을 사용하세요.

  • Time::HiRes, POSIX, Time::Local은 모두 코어 모듈이며 설치가 필요 없음
  • timegm()과 timelocal()의 월 인자는 0부터 시작: 11월에는 10을 전달
  • 연도 인자는 1900년 이후의 연수: 2023년에는 123을 전달
  • 임의의 날짜 문자열 파싱에는 수동 정규식 분리 대신 Time::Piece->strptime을 사용

FAQ

왜 localtime()은 문자열이 아니라 리스트를 반환하나?
리스트 컨텍스트에서 localtime($ts)는 (sec, min, hour, mday, mon, year, wday, yday, isdst)를 반환합니다. 스칼라 컨텍스트에서는 ctime 스타일 문자열을 반환합니다. 리스트에서 사용자 정의 형식 문자열을 만들려면 POSIX::strftime을 사용하세요.
Perl에서 1초 미만 타임스탬프를 얻으려면?
Time::HiRes를 사용하세요: 'use Time::HiRes qw(time); my $ms = int(time() * 1000);'. 이 모듈은 Perl 코어 모듈이므로 CPAN 설치가 필요 없습니다.