Python - Définition d'une datetime dans un fuseau horaire spécifique (sans conversions UTC)

StackOverflow https://stackoverflow.com/questions/4974712

  •  12-11-2019
  •  | 
  •  

Question

Juste pour être clair, c'est Python 2.6, j'utilise pytz.

Ceci est pour une application qui ne traite que les fuseaux horaires américains, je dois être en mesure d'ancrer une date (aujourd'hui) et d'obtenir un horodatage Unix (heure de l'époque) pour 20 h et 23 h en PST seulement.

Ça me rend fou.

> pacific = pytz.timezone("US/Pacific")

> datetime(2011,2,11,20,0,0,0,pacific)

datetime.datetime(2011, 2, 11, 20, 0, tzinfo=<DstTzInfo 'US/Pacific' PST-1 day, 16:00:0 STD>)

> datetime(2011,2,11,20,0,0,0,pacific).strftime("%s")
'1297454400'

zsh> date -d '@1297454400'    
Fri Feb 11 12:00:00 PST 2011

Donc, même si je configure un fuseau horaire et que je crée le DateTime avec Ce fuseau horaire, il le crée toujours comme UTC, puis le convertit. C'est plus un problème car l'UTC sera une journée à venir lorsque j'essaie de faire les calculs.

Existe-t-il un moyen facile (ou du moins sensuel) de générer un horodatage pour 20 heures PST aujourd'hui?

(Pour être clair, je comprends la valeur de l'utilisation de l'UTC dans la plupart des situations, comme les horodatages de la base de données, ou pour le stockage général. Ce n'est pas une de ces situations, j'ai spécifiquement besoin d'un horodat entrez-y.)

Était-ce utile?

La solution

Créer un objet tzinfo utc Pour le fuseau horaire UTC, essayez ceci:

#XXX: WRONG (for any timezone with a non-fixed utc offset), DON'T DO IT
datetime(2011,2,11,20,0,0,0,pacific).astimezone(utc).strftime("%s")

Éditer: Comme indiqué dans les commentaires, mettant le fuseau horaire dans le datetime Le constructeur n'est pas toujours robuste. La méthode préférée en utilisant le Documentation PYTZ serait:

pacific.localize(datetime(2011,2,11,20,0,0,0)).astimezone(utc).strftime("%s")

Notez également à partir des commentaires que strftime("%s") n'est pas fiable, c'est ne tient pas compte Les informations de fuseau horaire (même UTC) et assument le fuseau horaire du système sur lequel il fonctionne. Il s'appuie sur une implémentation sous-jacente de la bibliothèque C et ne fonctionne pas du tout sur certains systèmes (par exemple Windows).

Autres conseils

Il y a au moins deux problèmes:

  1. Vous ne devriez pas passer un fuseau horaire avec un décalage UTC non fixé comme "US/Pacific" comme paramètre tzinfo directement. Tu devrais utilisation pytz.timezone("US/Pacific").localize() méthode Au lieu
  2. .strftime('%s') n'est pas portable, Il ignore Tzinfo, et il utilise toujours le fuseau horaire local. Utilisation datetime.timestamp() ou ses analogues sur les versions Python plus anciennes Au lieu.

Pour faire une date de temps consacrée au fuseau horaire dans le fuseau horaire donné:

#!/usr/bin/env python
from datetime import datetime 
import pytz # $ pip install pytz

tz = pytz.timezone("US/Pacific")
aware = tz.localize(datetime(2011, 2, 11, 20), is_dst=None)

Pour obtenir un horodatage POSIX:

timestamp = (aware - datetime(1970, 1, 1, tzinfo=pytz.utc)).total_seconds()

(Sur Python 2.6, voir totimestamp() fonction sur comment imiter .total_seconds() méthode).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top