Кажется, здесь есть некоторая путаница: результат mtime не находится ни в каком часовом поясе, он находится в секундах, начиная с эпохи, которая является фиксированным моментом времени (за исключением високосных секунд, которые игнорируются). Таким образом, все, что вам нужно сделать, это представить его в нужном часовом поясе, который является UT C. В другом ответе упоминалось, как сделать это с помощью функции, которую вы использовали, но обычной функцией для форматирования времени в строку является strftime, который предоставляется парой основных модулей.
use strict;
use warnings;
use POSIX 'strftime';
# gmtime interprets the mtime seconds in UTC
my $timestamp = strftime "%a, %e %b %Y %X %Z", gmtime $mtime;
use Time::Piece 'gmtime';
my $timestamp = gmtime($mtime)->strftime("%a, %e %b %Y %X %Z");
Но ваше использование case на самом деле является указанным c форматом даты, который используется протоколом HTTP, и который всегда будет в GMT / UT C. Для этого есть модуль: HTTP :: Date
use strict;
use warnings;
use HTTP::Date 'time2str';
my $timestamp = time2str $mtime;