2016-08-10 3 views
-1

Я пытаюсь получить компьютер локальный часовой пояс пользователя с смещением в Perl, используя код ниже:Как получить локальный часовой пояс компьютера пользователя со смещением в Perl?

use POSIX; 
my $timezone = strftime("%z", localtime()); 
print "\n==Time zone offsets===".$timezone."\n"; 

выше вывода сценария печати, как показано ниже при запуске сценария на локальном компьютере:

==Time zone offsets===+0530 

При запуске же сценарий с живого сервера, но на том же компьютере, на котором отображается различный вывод, как показано ниже:

==Time zone offsets===-0400 

Я хочу, чтобы сценарий всегда повторялся смещение временной зоны локального компьютера пользователя вместо сервера.

Пожалуйста, помогите, я пытаюсь, но не получаю.

+1

Где находится ваш сервер в сети и где вы находитесь? Похоже, что одна или другая ваша система ошибочно настроена, но расхождение в 9,5 часов огромно! Для большинства ПК не существует способа узнать, где они находятся, если системный оператор не говорит им! – Borodin

+0

В настоящее время я нахожусь в Индии, но сервер в США – Laeeq

+0

Итак, цифры верны. Вам необходимо будет передать местный часовой пояс на сервер, чтобы внести необходимые корректировки. – Borodin

ответ

1

Вам необходимо указать часовой пояс пользователя. Это делается следующим образом, используя DateTime:

$ for tz in local Asia/Calcutta; do 
    perl -e' 
     use feature qw(say); 
     use DateTime qw(); 
     say DateTime->now(time_zone => $ARGV[0]); 
    ' "$tz" 
    done 
2016-08-10T13:20:06 
2016-08-10T22:50:06 

Вы также можете установить TZ ENV вар соответствующим образом.

$ export TZ 
$ for TZ in America/Toronto Asia/Calcutta; do 
    perl -e' 
     use feature qw(say); 
     use DateTime qw(); 
     say DateTime->now(time_zone => "local"); 
    ' 
    done 
2016-08-10T13:20:06 
2016-08-10T22:50:06 

TZ также влияет localtime.

$ export TZ 
$ for TZ in America/Toronto Asia/Calcutta; do 
    perl -e' 
     use feature qw(say); 
     use POSIX qw(strftime); 
     say strftime("%Y-%m-%dT%H:%M:%S", localtime); 
    ' 
    done 
2016-08-10T13:20:06 
2016-08-10T22:50:06 

Если изменить $ENV{TZ} в вашем скрипте, вам нужно вызвать POSIX::tzset(); впоследствии.

$ perl -e' 
    use feature qw(say); 
    use POSIX qw(strftime tzset); 
    for my $tz (qw(America/Toronto Asia/Calcutta)) { 
     $ENV{TZ} = $tz; 
     tzset(); 
     say strftime("%Y-%m-%dT%H:%M:%S", localtime); 
    } 
    ' 
2016-08-10T13:20:06 
2016-08-10T22:50:06