perl - How to make Time::Piece respect DST when converting localtime to UTC? -


i want convert timestamp localtime gmt. have legacy code "manually" time::local::timelocal() , gmtime. works, don't , wanted use time::piece instead. used this answer (albeit converting other way round, able replace + - :-)).

this code:

#!/usr/bin/env perl  use strict; use warnings; use time::local; use time::piece; use posix qw(strftime);  sub local_to_utc_timelocal {     $local_ts = shift;     ( $year, $mon, $mday, $hour, $min, $sec )          = ( $local_ts =~ /(\d\d)-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)/ );     $local_secs = time::local::timelocal( $sec, $min, $hour, $mday, $mon - 1, $year );     return posix::strftime( '%y-%m-%d %h:%m:%s', gmtime($local_secs) ); }  sub local_to_utc_timepiece {     $local_ts = shift;     $local_tp = time::piece->strptime( $local_ts, '%y-%m-%d %h:%m:%s' );     $utc_tp   = $local_tp - localtime->tzoffset(); # ***     return $utc_tp->strftime('%y-%m-%d %h:%m:%s'); }  $local;  # dst in effect (april 19 2016): $local = '16-04-19 14:30:00'; print "dst in effect:\n"; printf("utc(%s) = %s (using timelocal)\n", $local, local_to_utc_timelocal($local)); printf("utc(%s) = %s (using timepiece)\n\n", $local, local_to_utc_timepiece($local));  # dst not in effect (feb 19 2016): $local = '16-02-19 14:30:00'; print "dst not in effect:\n"; printf("utc(%s) = %s (using timelocal)\n", $local, local_to_utc_timelocal($local)); printf("utc(%s) = %s (using timepiece)\n", $local, local_to_utc_timepiece($local)); 

unfortunately time::piece code doesn't seem work wrt dst. i'm living in germany, (spring/summer, dst in effect) utc+2. "april 19 2016" above code gives:

dst in effect: utc(16-04-19 14:30:00) = 16-04-19 12:30:00 (using timelocal) utc(16-04-19 14:30:00) = 16-04-19 12:30:00 (using timepiece) 

which correct. "feb 19 2016" (when utc+1) same code gives:

dst not in effect: utc(16-02-19 14:30:00) = 16-02-19 13:30:00 (using timelocal) utc(16-02-19 14:30:00) = 16-02-19 12:30:00 (using timepiece) 

that is: gmtime(time::local::timelocal($timestamp)) gives correct 1 hour offset while time::piece still gives 2 hours offset.

is bug in time::piece or use wrongly?

i know there plenty of ways convert localtime utc i'd use time::piece because of simplicity. plus cannot use datetime because involve deploying on dozen of production machines.

problem 1

localtime returns now, localtime->tzoffset() returns offset now. change

my $utc_tp = $local_tp - localtime->tzoffset(); 

to

my $utc_tp = $local_tp - $local_tp->tzoffset(); 

however, leaves $utc_tp flagged localtime, want:

my $utc_tp = gmtime( $local_tp->epoch ); 

problem 2

despite name, $local_tp not local time, $local_tp->tzoffset() zero. change

time::piece->strptime( $local_ts, '%y-%m-%d %h:%m:%s' ) 

to

localtime->strptime( $local_ts, '%y-%m-%d %h:%m:%s' ); 

Comments

Popular posts from this blog

java - nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet Hibernate+SpringMVC -

sql - Postgresql tables exists, but getting "relation does not exist" when querying -

asp.net mvc - breakpoint on javascript in CSHTML? -