Yes, I get equivalent results -- I seem to be in the same time zone as you, and get a similar 5-hour "padding" of the difference between "localtime" and a given time string passed to either "from_mysql_datetime" or "strptime". Regarding this latter method, the Time::Piece man page says "see the [unix] strptime man page", and when I looked at that (on MacOSX BSD), it said "The resulting values will be relative to the local time zone." But it looks like Time::Piece is not treating it as such -- instead, it's treating the values as relative to GMT -- and so is behaving badly (or at least counter to apparent intention, which is bad).