ProgramingTip

Perl에서 YYYY-mm-dd HH : MM : SS로 빠르게 이동

bestdevel 2020. 11. 26. 19:42
반응형

Perl에서 YYYY-mm-dd HH : MM : SS로 빠르게 이동


Perl 펼쳐지는 때 종종 YYYY-mm-dd HH:MM:SS(예 :) 형식의 고급스러운 시간을 가져옵니다 2009-11-29 14:28:29.

이렇게하면서 나는이 매우 성가신 길을 택했다.

  • man perlfunc
  • /localtime현지 시간을 검색해야 할 경우- 맨 페이지의 관련 섹션으로 이동 다섯 번 ( /+ \n)을 반복 합니다.
  • ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);맨 페이지 페이지를 내 펼쳐 복사합니다 .
  • 시도 my $now = sprintf("%04d-%02d-%02d %02d:%02d:%02d", $year, $mon, $mday, $hour, $min, $sec);
  • 기억하세요 # 1 : 올해를 얻으려면 1900 년에 더해야합니다.
  • 시도 my $now = sprintf("%04d-%02d-%02d %02d:%02d:%02d", $year+1900, $mon, $mday, $hour, $min, $sec);
  • 기억하세요 # 2 : 이번 달을 더해야 $ mon에 1을해야합니다.
  • 시도 my $now = sprintf("%04d-%02d-%02d %02d:%02d:%02d", $year+1900, $mon+1, $mday, $hour, $min, $sec);
  • 괜찮아 보인다. 완료!

위에 설명 된 프로세스가 작동하는 동안 최적이 아닙니다. 더 똑똑한 방법이 확실하게 내 질문은 간단합니다.

YYYY-mm-dd HH:MM:SSPerl에서 현재 날짜 / 시간 을 얻는 가장 쉬운 방법은 무엇입니까?

"쉬움"은 "작성하기 쉬움"과 "기억하기 쉬움"을 모두 포함합니다.


strftime표준 모듈 에서 사용하십시오 . Perl의 바인딩에서 대한 인수 의 반환 값과 일치하도록 설계되었습니다 . 비교POSIXstrftimelocaltimegmtime

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

my          ($sec,$min,$hour,$mday,$mon,$year,$wday,     $yday,     $isdst) = gmtime(time);

명령 줄 사용의 예는 다음과 가변합니다.

$ perl -MPOSIX -le 'print strftime "%F %T", localtime $^T'

또는 소스 파일에서

use POSIX;

print strftime "%F %T", localtime time;

일부 시스템은 %F%T속기를 지원하지 않고 다음 같이 명시해야합니다.

print strftime "%Y-%m-%d %H:%M:%S", localtime time;

또는

print strftime "%Y-%m-%d %H:%M:%S", gmtime time;

time호출 널 현재 시간 반환하는 반면 프로그램이 시작된 시간으로 고정됩니다. 를 사용 하면 반환 값은 GMT의 현재 시간입니다. 를 사용하여 현지 언어의 시간을 검색합니다 .$^Tgmtimelocaltime


DateTime모듈을 사용하여 더러운 작업을 수행하지 않는 것은 무엇입니까? 작성 하고 기억 하기 !

use strict;
use warnings;
use DateTime;

my $dt   = DateTime->now;   # Stores current date and time as datetime object
my $date = $dt->ymd;   # Retrieves date as a string in 'yyyy-mm-dd' format
my $time = $dt->hms;   # Retrieves time as a string in 'hh:mm:ss' format

my $wanted = "$date $time";   # creates 'yyyy-mm-dd hh:mm:ss' string
print $wanted;

무슨 일이 일어나고 있는지 알면 임시를 제거하고 몇 줄의 코드를 절약 할 수 있습니다.

use strict;
use warnings;
use DateTime;

my $dt = DateTime->now;
print join ' ', $dt->ymd, $dt->hms;

이 시도 :

use POSIX qw/strftime/;
print strftime('%Y-%m-%d',localtime);

strftime방법은 나를 위해 관리 일합니다. 매우 간단하고 처음입니다.



Time :: Piece (Perl 5.10 이후 코어)에는 strftime 함수도 기본적으로 localtime 및 gmtime을 사용하여 Time :: Piece 함수를 반환합니다.

use Time::Piece;
print localtime->strftime('%Y-%m-%d');

또는 재정의 된 localtime없이 :

use Time::Piece (); 
print Time::Piece::localtime->strftime('%F %T');

다음 블록을 추가 1.000.000 번 호출하는 약간의 테스트 (VM의 FreeBSD에서 Perl v5.20.1)를 만들었습니다.

my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
my $now = sprintf("%04d-%02d-%02d %02d:%02d:%02d", $year+1900, $mon+1, $mday, $hour, $min, $sec);

my $now = strftime('%Y%m%d%H%M%S',localtime);

my $now = Time::Piece::localtime->strftime('%Y%m%d%H%M%S');

결과는 다음과 가변적입니다.

A : 2 초

B : 11 초

C : 19 초

이것은 물론 철저한 테스트 나 벤치 마크는 아니지만 적어도 나에게는 재현 가능하므로 더 복잡하더라도 datetimestamp 생성이 매우 자주 필요한 경우 첫 번째 방법을 선호합니다.

호출 (예 : FreeBSD 10.1에서)

my $now = `date "+%Y%m%d%H%M%S" | tr -d "\n"`;

OS와 무관하고 시간이 오래 걸리기 때문에 좋은 생각이 아닐 수도 있습니다.

안부 인사, Holger


Time::Piece::datetime()제거 할 수 있습니다 T.

use Time::Piece;
print localtime->datetime(T => q{ });

정확한 형식이 아닌 사람이 읽을 수있는 시간 문자열을 원하는 경우 :

$t = localtime;
print "$t\n";

인쇄물

Mon Apr 27 10:16:19 2015

또는 로케일에 대해 구성된 모든 것.


짧고 달콤하며 추가 모듈이 필요하지 않습니다.

my $toDate = `date +%m/%d/%Y" "%l:%M:%S" "%p`;

예를 들어 출력은 다음과 같습니다. 04/25/2017 9:30:33 AM


많은 경우에 필요한 '현재 시간'은 $ ^ T이며, 이는 UNIX 시대 이후 전체 초 (60 초라고 가정)에서 스크립트가 실행되기 시작한 시간입니다.

이렇게하면 스크립트의 초기 부분이 스크립트의 후반 부분과 다른 날짜 (또는 일광 절약 상태)를 사용하는 것을 방지합니다 (예 : 쿼리 조건 및 기타 파생 값).

'현재 시간'의 변형의 경우 상수를 사용하여 컴파일 타임에 고정되었음을 문서화 할 수도 있습니다.

use constant YMD_HMS_AT_START => POSIX::strftime( "%F %T", localtime $^T );

다른 고해상도 시작 시간 :

0+ [ Time::HiRes::stat("/proc/$$") ]->[10]

참고 URL : https://stackoverflow.com/questions/1814196/quickly-getting-to-yyyy-mm-dd-hhmmss-in-perl

반응형