aguyngueran
aguyngueran

Reputation: 1321

Python: how to create datetime in specific timezone and specific value

I need to create a specific date / time value in Python that corresponds to given value in specific time zone.

So far I'm struggling with this as the end results depends on the time zone server is running.

I'm using Python pytz package like below:

pprint.pprint({'%Z': strftime("%Z", gmtime())})
pprint.pprint({'%z': strftime("%z", gmtime())})
pprint.pprint({'tz': data['validFrom'].tzname()})
pprint.pprint({'before validFrom': data['validFrom'], 'before validTo': data['validTo']})

tz = pytz.timezone('Europe/Paris')

validFrom = data['validFrom']
validTo = data['validTo']

validFrom = datetime(year=validFrom.year, month=validFrom.month, day=validFrom.day, hour=0, minute=0, second=0)
validTo = datetime(year=validTo.year, month=validTo.month, day=validTo.day, hour=23, minute=59, second=59)

pprint.pprint({'before conversion validFrom': validFrom, 'before conversion validTo': validTo})
pprint.pprint({'before conversion validFrom': int(validFrom.strftime('%s')) * 1000, 'before conversion validTo': int(validTo.strftime('%s')) * 1000})

validFrom = tz.localize(validFrom)
validTo = tz.localize(validTo)

pprint.pprint({'after conversion validFrom': validFrom, 'after conversion validTo': validTo})
pprint.pprint({'after conversion validFrom': int(validFrom.strftime('%s')) * 1000, 'after conversion validTo': int(validTo.strftime('%s')) * 1000})

For a sample validFrom '2015-06-23' and validTo '2015-07-16', the above code outputs the following on the my computer:

{'%Z': 'CET'}
{'%z': '+0100'}
{'tz': None}
{'before validFrom': datetime.datetime(2015, 6, 23, 0, 0),'before validTo': datetime.datetime(2015, 7, 16, 0, 0)}
{'before conversion validFrom': datetime.datetime(2015, 6, 23, 0, 0),'before conversion validTo': datetime.datetime(2015, 7, 16, 23, 59, 59)}
{'before conversion validFrom': 1435010400000, 'before conversion validTo': 1437083999000}
{'after conversion validFrom': datetime.datetime(2015, 6, 23, 0, 0, tzinfo<DstTzInfo 'Europe/Paris' CEST+2:00:00 DST>),'after conversion validTo': datetime.datetime(2015, 7, 16, 23, 59, 59, tzinfo=<DstTzInfo 'Europe/Paris' CEST+2:00:00 DST>)}
{'after conversion validFrom': 1435010400000,'after conversion validTo': 1437083999000}

which is fine, while on the development server (having different time zone set):

{'%Z': 'UTC'}
{'%z': '+0000'}
{'tz': None}
{'before validFrom': datetime.datetime(2015, 6, 23, 0, 0), 'before validTo': datetime.datetime(2015, 7, 16, 0, 0)}
{'before conversion validFrom': datetime.datetime(2015, 6, 23, 0, 0), 'before conversion validTo': datetime.datetime(2015, 7, 16, 23, 59, 59)}
{'before conversion validFrom': 1435017600000, 'before conversion validTo': 1437091199000}
{'after conversion validFrom': datetime.datetime(2015, 6, 23, 0, 0, tzinfo=<DstTzInfo 'Europe/Paris' CEST+2:00:00 DST>),'after conversion validTo': datetime.datetime(2015, 7, 16, 23, 59, 59, tzinfo=<DstTzInfo 'Europe/Paris' CEST+2:00:00 DST>)}
{'after conversion validFrom': 1435017600000, 'after conversion validTo': 1437091199000}

So in both cases it looks like I have a valid datetime object associated with timezone as needed but somehow this is lost and resulting timestamp is invalid.

I'm not Python developer but I need to maintain piece of code written by someone else.

Upvotes: 2

Views: 1265

Answers (1)

Sait
Sait

Reputation: 19805

Are you trying to do this?

from datetime import datetime
from pytz import timezone

paris = timezone('Europe/Paris')
pst = timezone('US/Pacific')

print datetime.now() # local time
print datetime.now(paris)
print datetime.now(pst)

Here, datetime.now() may vary server to server, however datetime.now(paris) and datetime.now(pst) will be same in each server, if you call them at the same time.

Upvotes: 1

Related Questions