example - DateTime.TryParse() en Python?
strftime python (6)
Aquí hay una implementación de función equivalente
import datetime
def try_strptime(s, format):
"""
@param s the string to parse
@param format the format to attempt parsing of the given string
@return the parsed datetime or None on failure to parse
@see datetime.datetime.strptime
"""
try:
date = datetime.datetime.strptime(s, format)
except ValueError:
date = None
return date
¿Existe un equivalente a DateTime.TryParse()
C # en Python?
Editar:
Me refiero al hecho de que evita lanzar una excepción, no el hecho de que adivine el formato.
¿Qué tal strptime?
http://docs.python.org/library/time.html#time.strptime
Lanzará un ValueError si no puede analizar la cadena en función del formato que se proporciona.
Si no desea la excepción, capture la excepción.
try:
d = datetime.datetime.strptime(s, "%Y-%m-%d %H:%M:%S")
except ValueError:
d = None
En el zen de python, explícito es mejor que implícito. strptime
siempre devuelve una fecha y hora analizada en el formato exacto especificado. Esto tiene sentido, porque tienes que definir el comportamiento en caso de falla, tal vez lo que realmente quieres es.
except ValueError:
d = datetime.datetime.now()
o
except ValueError:
d = datetime.datetime.fromtimestamp(0)
o
except ValueError:
raise WebFramework.ServerError(404, "Invalid date")
Al hacerlo explícito, está claro para la siguiente persona que lo lea cuál es el comportamiento de conmutación por error y que es lo que necesita.
o tal vez confía en que la fecha no puede ser inválida, proviene de una columna DATETIME de la base de datos, en cuyo caso no habrá una excepción que atrapar, por lo que no la detectará.
Use time.strptime
para analizar las fechas de las cadenas.
Documentación: http://docs.python.org/library/time.html#time.strptime
Ejemplos de: http://pleac.sourceforge.net/pleac_python/datesandtimes.html
#-----------------------------
# Parsing Dates and Times from Strings
time.strptime("Tue Jun 16 20:18:03 1981")
# (1981, 6, 16, 20, 18, 3, 1, 167, -1)
time.strptime("16/6/1981", "%d/%m/%Y")
# (1981, 6, 16, 0, 0, 0, 1, 167, -1)
# strptime() can use any of the formatting codes from time.strftime()
# The easiest way to convert this to a datetime seems to be;
now = datetime.datetime(*time.strptime("16/6/1981", "%d/%m/%Y")[0:5])
# the ''*'' operator unpacks the tuple, producing the argument list.
No, lo que estás pidiendo no es idiomático Python, por lo que generalmente no habrá funciones que descarten errores como ese en la biblioteca estándar. Los módulos de biblioteca estándar relevantes están documentados aquí:
http://docs.python.org/library/datetime.html
http://docs.python.org/library/time.html
Todas las funciones de análisis generan excepciones en la entrada no válida.
Sin embargo, como han afirmado las otras respuestas, no sería terriblemente difícil construir una para su aplicación (su pregunta fue redactada "en Python" en lugar de "en la biblioteca estándar de Python", por lo que no está claro si la asistencia para escribir dicha función "en Python" está respondiendo la pregunta o no).
La fuerza bruta también es una opción:
def TryParse(datestring, offset):
nu = datetime.datetime.now()
retval = nu
formats = ["%d-%m-%Y","%Y-%m-%d","%d-%m-%y","%y-%m-%d"]
if datestring == None:
retval = datetime.datetime(nu.year,nu.month,nu.day,0,0,0) - datetime.timedelta(offset,0,0,0,0,0,0)
elif datestring == '''':
retval = datetime.datetime(nu.year,nu.month,nu.day,0,0,0) - datetime.timedelta(offset,0,0,0,0,0,0)
else:
succes = False
for aformat in formats:
try:
retval = datetime.datetime.strptime(datestring,aformat)
succes = True
break
except:
pass
if not succes:
retval = datetime.datetime(nu.year,nu.month,nu.day,0,0,0) - datetime.timedelta(offset,0,0,0,0,0,0)
return retval