Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Changing a unix timestamp to a different timezone

I retrieve a unix timestamp from a web service in a Python program. This timestamp is in a USA timezone. In order to insert it in a MySQL database with other objects, localized in France, I would like to convert this timestamp to the French timezone.

I could do it with mathematical functions, but there is the issue of daylight savings time. I would prefer to use Python time and date specific functions which should deal with these concepts.

Do you have a hint, I am lost in the Python documentation?

like image 857
kheraud Avatar asked Jul 15 '11 12:07

kheraud


People also ask

Is Unix timestamp same for all timezones?

The UNIX timestamp is the number of seconds (or milliseconds) elapsed since an absolute point in time, midnight of Jan 1 1970 in UTC time. (UTC is Greenwich Mean Time without Daylight Savings time adjustments.) Regardless of your time zone, the UNIX timestamp represents a moment that is the same everywhere.

Is Unix timestamp independent of timezone?

You can find out more about Unix time here, but it's basically a way of expressing a timestamp as an integer, in a way that's independent of time zone. The value itself is the number of seconds (or sometimes, milliseconds) elapsed since midnight UTC, January 1, 1970.


2 Answers

If it's really a unix timestamp, then it's UTC based. Just interpret it correctly for your use case. Apply the timezone translation only when you have to print this date as text.

If you're storing it as timestamp on your side too, keep it exactly as it is.

like image 142
viraptor Avatar answered Oct 23 '22 14:10

viraptor


I had a similar problem in the past when the timestamps of the files we downloaded from a service provider had timestamps corresponding to the PST time zone. The following helped me do to the conversion:

import pytz, datetime, time
import os

originalTimeStamp = os.stat("/tmp/file-from-us-west-coast").st_mtime

# prints e.g. 2010-03-31 13:01:18
print "original:",datetime.datetime.fromtimestamp(originalTimeStamp)

# re-interpret 
originalTimeZone = "America/Los_Angeles"
targetTimeZone   = "Europe/Paris"

newTimeStamp = pytz.timezone(originalTimeZone).localize(datetime.datetime.fromtimestamp(originalTimeStamp)).astimezone(pytz.timezone(targetTimeZone))

# prints e.g. 2010-03-31 22:01:18+02:00
print "new:     ",newTimeStamp

# convert back to seconds since epoch
newTimeStamp = time.mktime(newTimeStamp.timetuple())

# print time difference in hours
print (newTimeStamp - originalTimeStamp) / 3600.0
like image 40
Andre Holzner Avatar answered Oct 23 '22 13:10

Andre Holzner