Perl 시간 처리 함수 사용법 소개

하나.Perl 시간 표시 함수
1. 날짜를 나타내는 방법은 다양하다.
"18Jan1973";
"18/01/1973";
"01/18/1973";
"Jan181973";
"18-01-73";
"18-01-1973";
"01/73".
그중 일부 격식은 의미가 분명하지 않다(예를 들어 "01-06-1973", 6월 1일을 표시합니까, 아니면 1월 6일을 표시합니까?)
만약 날짜의 표시 형식을 규정하지 않으면 처리하기 매우 어렵다.
'18Jan1973'와'6Sep1950'사이의 차이를 이해하려면 그것들을 숫자 표시로 전환해야 한다.
유닉스 내부 운용 기원초는 시간을 표시한다.
날짜와 시간을 합치면 다음과 같습니다.
그린웨이지 시간인 1970년 1월 1일 자정(기원)부터 현재 시간 사이의 초수.
예를 들어'18 Jan 1973:(자정으로 가정)의 기원초는 96163200이다.
2. 이 시스템에서 자정은 하루의 시작 시간을 나타낸다.
Perl에서 제공하는 gmtime 함수를 통해 날짜를 생성합니다.
기원 이후의 초수를 나타내는 정수를 정하고 gmtime 함수를 통해 해당하는 날짜와 시간을 계산할 수 있습니다.
예:
gmtime () 함수를 호출하면 시, 분, 초, 날짜, 월, 연도 등 일련의 값 목록을 얻을 수 있습니다.

#!/usr/bin/perl
use Time::localtime;

$t_num = 96163200;
$tm = scalar(gmtime($t_num));
print $tm,"
";
출력:
Thu Jan 18 00:00:00 1973
예2: ","을 구분자로 출력하는 시간print join(",", gmtime(96163200));0,0,0,18,0,73,4,17,0
의미:
앞의 3개 수: 0, 0, 0, 각각 초, 분, 시를 나타낸다.시간은 0-23이기 때문에 오후는 12시 이후입니다.
네 번째 수: 18, 해당 월의 일수를 나타낸다(이 예는 18호).
다섯 번째 수: 0, 월, 0부터(1월을 대표).
0부터 시작하는 이유는 월이 월수 그룹의 하표에 대응하기 때문이다.

@months = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
$month = @months[(gmtime($t_num))[4]];
print "MONTH: ",$month,"
";
여섯 번째 수: 73, 연도, (이 예는 73)의 표시는 좀 특수하다.그것은 결코 연도의 마지막 두 자리 숫자가 아니다.
그것은 1900년부터 시작된 연도를 나타낸다.
왜 이렇게 표시를 해요?
C언어가 이렇게 처리되기 때문이다.
Perl은 라이브러리와 시스템을 운영체제에 최대한 가깝게 호출하려고 합니다.
따라서 네 자릿수의 연도를 출력하려면 다음과 같이 하십시오.$year=(gmtime(96163200))[5]+1900;만약 당신이 이런 처리 방식을 이해하지 못한다면 Y2K 의문이 생길 것이다. 당신은 아마도 이렇게 쓸 것이다.
$year="19".(gmtime(96163200))[5]; #실수!2000년에는 19100으로 바뀔 것이다
일곱 번째 수: 4, 일주일 중 며칠(일요일은 0)을 나타낸다.
여덟 번째 수: 17, 1년 중 며칠째(0은 1년 중 첫날을 나타낸다).
아홉 번째 수: 0, 서머타임을 사용할 수 있습니까?
3. Perl의 time() 함수는 기원초 형식으로 표시된 현재 날짜와 시간을 되돌려줍니다.
문자열로 변환하려면 gmtime () 과 localtime () 함수를 사용할 수 있습니다.

$now=localtime(time());
($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst)=localtime(time());
localtime () 또는 gmtime () 를 호출할 때 인자가 없으면 time () 를 호출합니다

$now=localtime();
($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst)=localtime();
2.Perl 시간 처리 함수 (날짜 및 시간 작업)
1. 두 시간 사이의 시간대를 계산하고,
그것들을 상응하는 기원초로 바꾸고 두 수를 줄이면 된다.
$difference_in_seconds=$later_datetime-$earlier_datetime;
초를 분, 시, 또는 일수로 변환하려면 각각 603600과 86400으로 나누어야 합니다.

$difference_in_minutes=$difference_in_seconds/60;
$difference_in_hours=$difference_in_seconds/3600;
$difference_in_day=$difference_in_seconds/86400;
2. "4일 후 며칠?":

$then=time()+86400*4;
print scalar(localtime($then));
그것이 제시한 답안은 초까지 정확하다.
예를 들어,
만약 4일 후의 기원초 값이 932836935라면, 날짜의 문자열을 다음과 같이 출력할 수 있습니다.
Sat Jul 24 11:23:17 1999
3. 어느 날짜를 출력하는 자정 무렵
"Sat Jul 24 00:00:00 1999"와 같이
다음 모듈을 사용합니다.
$then=$then-$then%86400;#그 날짜의 꼬리를 떼다
이와 유사하게 반올림법으로 자정에 가장 가까운 날짜를 출력할 수 있다.

$then += 43200; #add on half a day
$then = $then - $then%86400; #truncate to the day
만약 당신의 시간대 거리가 GMT에서 짝수 시간 차이라면, 이것은 쓸모가 있다.
모든 시간대가 쉽게 처리되는 것은 아니다.
네가 진실로 필요로 하는 것은 GMT에서 계산하는 것이 아니라 너 자신의 시간대에서 기원초를 계산하는 것이다.
Perl의 Time::Local 모듈,
두 개의 함수 timelocal () 과 timegm () 을 제공할 수 있습니다.그 반환 값은 localtime () 과 gmtime () 과 같습니다.

use Time::Local;
$then = time() + 4*86400;
$then = timegm(localtime($then)); #local epoch seconds
$then -= $then%86400; #truncate to the day
$then = timelocal(gmtime($then)); #back to gmt epoch seconds
print scalar(localtime$then,“
”。
셋.Perl 시간 처리 함수에서 일상생활에 사용되는 날짜와 시간의 표시
앞에서 시, 분, 연등치의 뜻을 소개하고 기원초의 뜻도 이해했다.
일상생활의 날짜와 시간은 문자열로 표시되고,
어떻게 해야만 일상적으로 사용하는 날짜와 시간 직렬 형식을 기원초로 바꿀 수 있습니까?
1. 요령 중 하나는 문법 분석 프로그램을 작성하는 것이다. 이 요령은 유연하고 빠르다.

#!/usr/bin/perl

use Time::Local;
@months{qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)}=(0..11);
$_ = "19 Dec 1997 15:30:02";
/(\d\d)\s+(\w+)\s+(\d+)\s+(\d+):(\d+):(\d+)/ or die "Notadate";


$mday=$1;
$mon=exists($months{$2})?$months{$2}:die"Badmonth";
$year=$3-1900;
($h,$m,$s)=($4,$5,$6);
$epoch_seconds = timelocal($s,$m,$h,$mday,$mon,$year);


print "day: ",$mday,"
"; print "mon: ",$mon,"
"; print "year: ",$year,"
"; print "seconds: ",$epoch_seconds,"
";
2. 좀 더 일반적인 요령은 CPAN에서 Date::Manip 모듈을 설치하는 것이다.

useDate::Manip;
$epoch_seconds=UnixDate("19 Dec 1997 15:30:02","s");
Date::Manip은 큰 모듈이기 때문에 이 모듈을 사용할 때 프로그램의 시작 시간을 추가합니다.
그 중 하나는 Date::Manip이 다양한 형식을 식별합니다.
예:
"today"
"now"
"first sunday in april 2000"
"3:15,today"
"3:15 pm,first sunday in april 2000"
"2000/01/18 09:15"Date Manipulation
2036,2037,2038,…,1901?!
사.대부분의 C 프로그램은 기원초를 기호 정수로 저장하여 양과 음의 날짜를 표시할 수 있다.
그러나 컴퓨터 메모리가 표시하는 정수 크기는 유한하고 유한한 비트로 초를 표시한다.
이것이 바로 우리가 기원초를 계산할 때 표시한 날짜는 한정되어 있다는 것이다.
정확한 한도는 너의 기계가 표시할 수 있는 정수의 자릿수에 달려 있다.
Perl은 최대 32비트 길이로 정수를 저장합니다.
대충 말하면 한 명은 양과 음, 나머지 31명은 수를 표시한다.
만약 8자리라면, 당신이 저장할 수 있는 최대 수는 255, 즉 2의 8회에서 1로 줄어든다.
따라서 Perl에 저장된 32비트 기호의 최대 수는 다음과 같습니다.

print 2**31-1,"
"; 2147483647
이 숫자는 어느 날짜에 대응했습니까?

print scalar(gmtime(2**31-1)),"
"; Tue Jan 19 03:14:07 2038
그 순간의 1초 뒤에 무슨 일이 일어날까요?

print scalar(gmtime(2**31)),"
"; Fri Dec 13 20:45:52 1901
32자리의 기호 정수에 대해 말하자면, 2*31은 너무 크다.
그것은 "돌돌 말아 넘겼다"고 기호 위치가 음표로 설정되어 표시할 수 있는 최대 음수가 되었다.
이는 1970년 시작 시각 이전의 초의 최대치에 해당한다.
그 결과는 무엇을 설명했습니까?너는 gmtime(2**31) 이전이나 gmtime(2**31-1) 이후의 기원초로 표시된 날짜를 저장할 수 없다.
너는 절대로 생각하지 마라, 이것은 결코 큰 의문이 아니다.
만약 당신이 기호 정수가 표시된 기원초 32분의 시간을 사용하려면 당신의 표시 방식을 바꾸어야 합니다.
CPAN에서 많은 날짜 모듈을 찾을 수 있습니다. 그중의 날짜:::Calc와 날짜:::Manip은 기능이 가장 강한 두 모듈일 가능성이 높습니다.
이 두 모듈은 Y1901-Y2038의 제한을 방지하기 위해 자신의 날짜 표시 방식을 운용한다.
날짜::Manip는 로마 역법을 운용하여 서기 0000에서 서기 9999까지.
Date:::Calc도 로마역법을 활용하여 표시할 수 있는 연도는 1부터 32767까지입니다.
총결산
Perl 시간 처리 함수에서 1902-2037 범위 내의 날짜와 시기에 대해 기원초로 변환하고,
이 수를 저장하려면 정수 산술 연산, gmtime () 과localtime () 함수, 그리고 표준 Time::Local 모듈을 사용하십시오.
범위 이외의 날짜를 계산하거나 특정한 날짜 형식을 분석하려면
CPAN의 Date::Manip과 Date::Calc 모듈을 사용할 수 있습니다.

좋은 웹페이지 즐겨찾기