2009-06-13 33 views
7

Tôi đã giả sử nó sẽ đơn giản như $ENV{TZ}, nhưng biến môi trường TZ chưa được đặt, và lệnh date vẫn biết tôi đang ở trong EDT, vì vậy phải có một số cách khác để xác định múi giờ (trừ nói chomp(my $tz = qx/date +%Z/);) .Làm cách nào để xác định múi giờ hiện tại mà máy được đặt bằng Perl?

+0

Chỉ để biết thêm thông tin, trên hệ thống của tôi, múi giờ được quy định bởi tệp/etc/localtime và libc xuất hiện để biết cách sử dụng. –

Trả lời

14
use POSIX; 
print strftime("%Z", localtime()), "\n"; 
+0

Tôi nghĩ về% Z, nhưng tôi nhớ một vài điều về nó không hoạt động trên một số hệ thống. –

+0

Theo strftime người đàn ông,% Z là một đặc điểm kỹ thuật tiêu chuẩn và cần được hỗ trợ trên tất cả các nền tảng. –

+1

Tôi nghĩ rằng tôi đã ghi nhớ điều này từ các tài liệu POSIX: Trình định danh "Z" nổi tiếng không đáng kể vì tên của múi giờ không chuẩn. Gắn bó với các số chỉ định là tuyến đường an toàn nhất. Nhưng tôi nghĩ điều này có lẽ đủ an toàn cho mục đích của tôi. –

5
use POSIX; 
localtime(); 
my ($std, $dst) = POSIX::tzname(); 

tzname() cung cấp cho bạn truy cập vào các POSIX toàn cầu tzname - nhưng bạn cần phải đã kêu gọi localtime() cho nó được đặt ở nơi đầu tiên.

6

Nếu bạn muốn một cái gì đó di động hơn POSIX (nhưng có lẽ chậm hơn), bạn có thể sử dụng DateTime :: TimeZone cho việc này:

use DateTime::TimeZone; 

print DateTime::TimeZone->new(name => 'local')->name(); 
1

Có lẽ đây nhanh hơn:

my @lt = localtime(12*60*60); 
my @gt = gmtime(12*60*60); 
$tz = @lt[2] - @gt[2]; 
$tz_ = sprintf("%+03d:00", $tz); # for +02:00 format 
+0

Để bổ sung cho câu trả lời của bạn, bạn có thể sử dụng nút [edit] (http://stackoverflow.com/posts/29400576/edit). – ZygD

0

Nếu bạn chỉ cần một cái gì đó như +05:30 (UTC + 5.5/Ấn Độ thời gian), bạn có thể sử dụng mã sau đây.

my @lt = localtime(); 
my @gt = gmtime(); 

my $hour_diff = $lt[2] - $gt[2]; 
my $min_diff = $lt[1] - $gt[1]; 

my $total_diff = $hour_diff * 60 + $min_diff; 
my $hour = int($total_diff/60); 
my $min = abs($total_diff - $hour * 60); 

print sprintf("%+03d:%02d", $hour, $min); 

Câu trả lời này được lấy cảm hứng từ câu trả lời của Pavel ở trên.

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