2009-03-31 5 views
1

Parfois self.start est unicode:Python: test pour unicode, et conversion en temps()

par exemple.

>>>self.start 
u'07:30:00' 

Ce qui fait datetime.combine se plaignent

start = datetime.combine(self.job_record.date, self.start) 

Comment peut-on:

  1. test pour unicode?
  2. Convertir à partir de 07: 30: 00 'à datetime.time?
+0

ajouter le message d'erreur réelle! – hop

Répondre

2

datetime.combine se plaint car il s'attend à ce que le second argument soit une instance datetime.time, et non une chaîne (ou une chaîne unicode).

Il existe plusieurs façons de convertir votre chaîne en instance datetime.time. Une façon serait d'utiliser datetime.strptime:

t = datetime.strptime(self.start, "%H:%M:%S").time() 
start = datetime.combine(self.job_record.date, t) 
4

Vérification des unicode:

>>> import types 
>>> type(u'07:30:00') is types.UnicodeType 
True 
>>> type('regular string') is types.UnicodeType 
False 

Conversion des chaînes en temps:

>>> import time 
>>> time.strptime(u'07:30:00', '%H:%M:%S') 
(1900, 1, 1, 7, 30, 0, 0, 1, -1) 
0

En supposant qu'il n'y aura pas être étendue caractères charset en '07: 30: 00' , puis utilisez str(self.start).

S'il existe une possibilité que les nombres de l'heure soient spécifiques à un jeu de caractères, utilisez encode(), avec un spécificateur d'argument error approprié pour convertir en chaîne.

Cela peut être un cas où il est plus pythonique d'essayer d'abord str() et d'utiliser except pour gérer les cas qui ne peuvent pas être convertis (demander pardon plutôt que la permission). Si la plupart des valeurs que vous essayez de convertir échouent, en revanche, convertissez-les d'abord avant d'appliquer la fonction. En outre, la fonction combine attend un objet datetime.date et un objet datetime.time. Si vous voulez vraiment éviter un comportement imprévisible, puis répondre aux exigences de l'API et passer date et time objets, plutôt que d'essayer de court-circuiter le contrat spécifié par la documentation: convertir les arguments avant vous appelez combine, plutôt que de demander combine à deviner pour vous.