I've only used localtime->strptime() to get a localtime instance from a time without a time zone.
To get a localtime instance directly from a time with a time zone, I just combine localtime and Time::Piece->strptime()->epoch.
#!/usr/bin/env perl
use strict;
use warnings;
use Test::More ('no_plan');
use Time::Piece;
$ENV{'TZ'} = 'America/Los_Angeles';
my $datestr = '2017-06-19 10:07:42-0700';
my $t = localtime(Time::Piece->strptime($datestr, '%Y-%m-%d %H:%M:%S%z
+')->epoch);
is($Time::Piece::VERSION, 1.31);
is($t->epoch, 1497892062);
is($t->tzoffset, -25200);
is($t->strftime, 'Mon, 19 Jun 2017 10:07:42 PDT');
is($t->strftime('%Y-%m-%d %H:%M:%S%z'), $datestr);