2010-02-24 38 views
11

Tôi đang cố gắng chuyển đổi ngày/giờ GMT 0 thành GMT -6 trong Perl.Làm thế nào tôi có thể chuyển đổi múi giờ trong Perl?

Ví dụ, một thời gian DHCP Server là thuê theo định dạng sau:

2010/02/18 23:48:37

Tôi cố gắng để chuyển đổi thời gian đó để các localtime vùng (GMT -6) nhưng cần nó để tôn vinh tiết kiệm ánh sáng ban ngày.

Tập lệnh bên dưới có thể quá mức cần thiết, nhưng tôi không chắc chắn cách tiếp tục từ đây. (Bất kỳ đề xuất sẽ là awsome).

my $TIMESTART; 

$TIMESTART = "2010/02/18 23:48:37"; 
$TIMESTART =~ s/\//-/g; 

use DateTime; 
use DateTime::TimeZone; 

use DateTime::Format::MySQL; 
my $dt = DateTime::Format::MySQL->parse_datetime($TIMESTART); 

my $tz = DateTime::TimeZone->new(name => 'America/Chicago'); 

print $tz->offset_for_datetime($dt) . "\n"; 

Nó sẽ ra những dòng sau:

2010-02-18T23: 48: 37
-21600

tôi cần để có thể thêm -21.600 đến để có múi giờ địa phương của GMT -6 nhưng tôi không chắc chắn làm thế nào để phê chuẩn điều này.

+3

Khác với sử dụng tại Vương quốc Anh, vui lòng sử dụng UTC, thay vì GMT làm giờ chuẩn quốc tế. Một số hệ thống giả định GMT có nghĩa là UTC, trong khi các hệ thống khác giả định GMT/BST, như được sử dụng ở Anh. – mctylr

+0

Tôi đoán có nhiều cách để thực hiện việc này. – mob

Trả lời

18

Gọi set_time_zone phương pháp 2 lần:

my $dt = DateTime::Format::MySQL->parse_datetime($TIMESTART); 
$dt->set_time_zone('UTC'); ## set timezone of parsed date time 
$dt->set_time_zone('America/Chicago'); ## change timezone in safe way 

print DateTime::Format::MySQL->format_datetime($dt),"\n"; ## check the result 

Cách hoạt động:

  • khi bạn tạo DateTime đối tượng mà không cần múi giờ quy định, " "múi giờ nổi" được đặt
  • cuộc gọi đầu tiên của set_time_zone thay đổi múi giờ thành UTC mà không cần chuyển đổi
  • cuộc gọi thứ hai của set_time_zone thay đổi UTC để America/Chicago
+0

Chạy nó lần thứ hai là phần tôi đã mất tích. Nó hoạt động, cảm ơn. – jinanwow

+1

Cảm ơn lời khuyên này! Tôi cũng đã không nhận ra cuộc gọi thứ hai để set_time_zone() là chìa khóa. –

-2
#!/usr/bin/perl -w 
($sec,$min,$hour,$mday,$mon,$year) = gmtime(time+21600); 
$year = $year + 1900; 
printf("%02d:%02d:%02d %02d.%02d.%04d\n", $hour,$min,$sec,$mday,$mon,$year); 
+1

Đôi khi điều này không đúng, vì nó bỏ qua phần câu hỏi có nội dung "nhưng cần nó để tôn vinh giờ tiết kiệm ánh sáng ban ngày". –

1

này sẽ chuyển đổi thời gian tính theo giờ UTC vào thời gian ETC. Bạn cũng có thể sử dụng ngày/giờ ở bất kỳ định dạng nào bằng cách sử dụng tham số + FORMAT của ngày.

ngày --date = 'TZ = "ETC" 18:30'

Các vấn đề liên quan