Mostrar la hora en una zona horaria diferente

Resuelto Adam Matan asked hace 15 años • 11 respuestas

¿Existe una forma elegante de mostrar la hora actual en otra zona horaria?

Me gustaría tener algo con el espíritu general de:

cur = <Get the current time, perhaps datetime.datetime.now()>
print("Local time   {}".format(cur))
print("Pacific time {}".format(<something like cur.tz('PST')>))
print("Israeli time {}".format(<something like cur.tz('IST')>))
Adam Matan avatar Sep 09 '09 16:09 Adam Matan
Aceptado

Un método más sencillo:

from datetime import datetime
from pytz import timezone    

south_africa = timezone('Africa/Johannesburg')
sa_time = datetime.now(south_africa)
print sa_time.strftime('%Y-%m-%d_%H-%M-%S')
Mark Theunissen avatar Feb 23 '2011 20:02 Mark Theunissen

Podrías usar la biblioteca pytz :

>>> from datetime import datetime
>>> import pytz
>>> utc = pytz.utc
>>> utc.zone
'UTC'
>>> eastern = pytz.timezone('US/Eastern')
>>> eastern.zone
'US/Eastern'
>>> amsterdam = pytz.timezone('Europe/Amsterdam')
>>> fmt = '%Y-%m-%d %H:%M:%S %Z%z'

>>> loc_dt = eastern.localize(datetime(2002, 10, 27, 6, 0, 0))
>>> print loc_dt.strftime(fmt)
2002-10-27 06:00:00 EST-0500

>>> ams_dt = loc_dt.astimezone(amsterdam)
>>> ams_dt.strftime(fmt)
'2002-10-27 12:00:00 CET+0100'
Andre Miller avatar Sep 09 '2009 10:09 Andre Miller

Python 3.9 (o superior): use zoneinfo de la biblioteca estándar:

from datetime import datetime, timezone
from zoneinfo import ZoneInfo

# Israel and US/Pacific time:
now_Israel = datetime.now(ZoneInfo('Israel'))
now_Pacific = datetime.now(ZoneInfo('US/Pacific'))
print(f"Israeli time {now_Israel.isoformat(timespec='seconds')}")
print(f"Pacific time {now_Pacific.isoformat(timespec='seconds')}")
# Israeli time 2021-03-26T18:09:18+03:00
# Pacific time 2021-03-26T08:09:18-07:00

# for reference, local time and UTC:
now_local = datetime.now().astimezone()
now_UTC = datetime.now(tz=timezone.utc)
print(f"Local time   {now_local.isoformat(timespec='seconds')}")
print(f"UTC          {now_UTC.isoformat(timespec='seconds')}")
# Local time   2021-03-26T16:09:18+01:00 # I'm on Europe/Berlin
# UTC          2021-03-26T15:09:18+00:00

Nota: hay una corrección de desuso para pytz.

Versiones anteriores de Python 3 : puede usarlaszoneinfoa través del módulo backports o usar dateutil en su lugar. dateutiltz.gettzsigue la misma semántica quezoneinfo.ZoneInfo:

from dateutil.tz import gettz

now_Israel = datetime.now(gettz('Israel'))
now_Pacific = datetime.now(gettz('US/Pacific'))
print(f"Israeli time {now_Israel.isoformat(timespec='seconds')}")
print(f"Pacific time {now_Pacific.isoformat(timespec='seconds')}")
# Israeli time 2021-03-26T18:09:18+03:00
# Pacific time 2021-03-26T08:09:18-07:00
FObersteiner avatar Aug 28 '2020 06:08 FObersteiner

La respuesta más corta de la pregunta puede ser como:

from datetime import datetime
import pytz
print(datetime.now(pytz.timezone('Asia/Kolkata')))

Esto imprimirá:

2019-06-20 12:48:56.862291+05:30

Vinod avatar Jun 20 '2019 07:06 Vinod

Este script que hace uso de los módulos pytzy datetimeestá estructurado según lo solicitado:

#!/usr/bin/env python3

import pytz
from datetime import datetime, timezone

utc_dt = datetime.now(timezone.utc)

PST = pytz.timezone("US/Pacific")
IST = pytz.timezone("Asia/Jerusalem")

print("UTC time     {}".format(utc_dt.isoformat()))
print("Local time   {}".format(utc_dt.astimezone().isoformat()))
print("Pacific time {}".format(utc_dt.astimezone(PST).isoformat()))
print("Israeli time {}".format(utc_dt.astimezone(IST).isoformat()))

Produce lo siguiente:

$ ./timezones.py 
UTC time     2019-02-23T01:09:51.452247+00:00
Local time   2019-02-23T14:09:51.452247+13:00
Pacific time 2019-02-22T17:09:51.452247-08:00
Israeli time 2019-02-23T03:09:51.452247+02:00
htaccess avatar Feb 23 '2019 01:02 htaccess