Perl에서 날짜를 구문 분석하고 시간대를 변환하려면 어떻게해야합니까?

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

문제

나는 그것을 사용했다 현지 시각 현재 날짜와 시간을 얻으려면 Perl에서 기능하지만 기존 날짜로 구문 분석해야합니다. 다음 형식의 GMT 날짜가 있습니다. "20090103 12:00"작업 할 수있는 날짜 개체로 구문 분석 한 다음 GMT 시간/날짜를 현재 동부 표준 시간 인 현재 시간대로 변환하고 싶습니다. . 따라서 "20090103 12:00"을 "20090103 7:00"로 변환하고 싶습니다.이 작업을 수행하는 방법에 대한 정보는 크게 감사하겠습니다.

도움이 되었습니까?

해결책

날짜 처리 인터페이스가 내장 된 Perl은 일종의 어리 석고 당신은 약 6 개의 변수를 통과하기 때문에 더 좋은 방법은 어느 쪽이든 사용하는 것입니다. 날짜 시간 또는 계시기. DateTime은 모든 싱싱, 모든 댄스 퍼플 날짜 객체이며 결국 사용하고 싶을 것입니다. 그러나 Time :: 조각은이 작업에 더 간단하고 완벽하게 적합하며 5.10으로 배송의 장점이 있으며 기술은 다음과 같습니다. 기본적으로 둘 다 동일합니다.

시간 :: 조각 및 strptime.

#!/usr/bin/perl

use 5.10.0;

use strict;
use warnings;

use Time::Piece;

# Read the date from the command line.
my $date = shift;

# Parse the date using strptime(), which uses strftime() formats.
my $time = Time::Piece->strptime($date, "%Y%m%d %H:%M");

# Here it is, parsed but still in GMT.
say $time->datetime;

# Create a localtime object for the same timestamp.
$time = localtime($time->epoch);

# And here it is localized.
say $time->datetime;

그리고 대조적으로 여기에 있습니다.

형식이 고정되어 있으므로 정규 표현식은 정상적으로 수행되지만 형식이 변경되면 Regex를 조정해야합니다.

my($year, $mon, $day, $hour, $min) = 
    $date =~ /^(\d{4}) (\d{2}) (\d{2})\ (\d{2}):(\d{2})$/x;

그런 다음 Unix Epoch 시간으로 변환하십시오 (1970 년 1 월 1 일 이후 초)

use Time::Local;
# Note that all the internal Perl date handling functions take month
# from 0 and the year starting at 1900.  Blame C (or blame Larry for
# parroting C).
my $time = timegm(0, $min, $hour, $day, $mon - 1, $year - 1900);

그런 다음 현지 시간으로 돌아갑니다.

(undef, $min, $hour, $day, $mon, $year) = localtime($time);

my $local_date = sprintf "%d%02d%02d %02d:%02d\n",
    $year + 1900, $mon + 1, $day, $hour, $min;

다른 팁

다음은 사용하는 예입니다 날짜 시간 그리고 그것 strptime 형식 모듈.

use DateTime;
use DateTime::Format::Strptime;

my $val = "20090103 12:00";

my $format = new DateTime::Format::Strptime(
                pattern => '%Y%m%d %H:%M',
                time_zone => 'GMT',
                );

my $date = $format->parse_datetime($val);

print $date->strftime("%Y%m%d %H:%M %Z")."\n";

$date->set_time_zone("America/New_York");  # or "local"

print $date->strftime("%Y%m%d %H:%M %Z")."\n";

$ perl dates.pl
20090103 12:00 UTC
20090103 07:00 EST


로컬 타임을 구문 분석하고 싶었다면 다음은 어떻게 해야하는지에 대해 다음과 같습니다. :)

use DateTime;

my @time = (localtime);

my $date = DateTime->new(year => $time[5]+1900, month => $time[4]+1,
                day => $time[3], hour => $time[2], minute => $time[1],
                second => $time[0], time_zone => "America/New_York");

print $date->strftime("%F %r %Z")."\n";

$date->set_time_zone("Europe/Prague");

print $date->strftime("%F %r %Z")."\n";

그게 내가하는 일이야 ...

#!/usr/bin/perl
use Date::Parse;
use POSIX;

$orig = "20090103 12:00";

print strftime("%Y%m%d %R", localtime(str2time($orig, 'GMT')));

당신은 또한 사용할 수 있습니다 Time::ParseDate 그리고 parsedate() 대신에 Date::Parse 그리고 str2time(). 사실상 표준 ATM. dateTime 인 것 같습니다 (그러나 타임 스탬프를 변환하기 위해 OO 구문을 사용하고 싶지 않을 수도 있습니다).

선택해라:

의심 할 여지없이 다른 사람들이 있지만 아마도 그들은 아마도 최고의 경쟁자 일 것입니다.

use strict;
use warnings;
my ($sec,$min,$hour,$day,$month,$year)=localtime();
$year+=1900;
$month+=1;
$today_time = sprintf("%02d-%02d-%04d %02d:%02d:%02d",$day,$month,$year,$hour,$min,$sec);
print $today_time;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top