2016-07-18 5 views
1

다음 라이너가 있습니다. 오늘 날짜를 일주일 전부터 읽을 수있는 형식으로 변환해야합니다.Perl, 타임 스탬프를 읽을 수있는 날짜로 변경하십시오.

Usage: POSIX::strftime(fmt, sec, min, hour, mday, mon, year, wday = -1, yday = -1, isdst = -1) 

사람이 문제가 여기에 무엇을 제안 할 수 있습니다 :

my $week_ago = strftime("%Y-%m-%d", time - 604800);

그러나 나는 다음과 같은 오류가 발생합니다? 내 이해에서 strftime 시간 스탬프를 읽을 수있는 날짜로 변환해야합니다.

답변

4

는 POSIX의 strftime이 vaules의 목록이 아니라 유닉스 타임 스탬프를 소요했다. 전화하기 전에 localtime 또는 gmtime으로 전화해야합니다.

my $one_minute_ago = strftime("%Y-%m-%d", localtime(time - 60)); 

위의 예는 하루 미만의 짧은 금액으로 날짜 계산을하는 경우에는 문제가 없습니다. 위의 모든 것은 오류가 발생하기 쉽습니다. 1 주 전 시나리오의 경우 sobrique's answer을 대신 사용하십시오.

4

Time::Piece을 사용하십시오. localtime (및 gmtime)을 대체하지만 훨씬 유용한 형태로 바뀌는 핵심 모듈입니다.

use Time::Piece; 
my $week_ago = localtime() - 604800; 
print $week_ago -> strftime("%Y-%m-%d"); 

주 - 모두 localtimegmtime 이제 너무 그것으로 숫자 비교를 할 수 있음을 의미하는 Time::Piece 오브젝트를 돌려줍니다.

는 또한 명확하게 할 수 있습니다 - 수입 Time::Seconds 및 사용 유용한 상수 코멘트에 보로딘에서 언급 한 바와 같이 (같은 ONE_DAYONE_WEEK)를 정의 할 수 있습니다. 귀하의 오류 메시지로

use Time::Piece; 
use Time::Seconds qw (ONE_WEEK); 
my $week_ago = localtime() - ONE_WEEK; 
+0

또는 원하는 시간에 따라 gmtime – ysth

+1

또한'Time :: Seconds 'ONE_WEEK''과'localtime (time-ONE_WEEK)'을 사용하십시오. – Borodin

+0

'localtime (time-604800)'과 같은 시간에 수학 계산하기 와'localtime (time - ONE_WEEK)'이 잘못되었습니다; 때로는 잘못된 결과가 나옵니다. Time :: Piece 객체에 대한 산술 수행 만 안전합니다. 결정된. – ikegami

관련 문제