首先:永远不要将 数据库中的日期或日期时间存储为字符串。
绝不。
了解?
您应该始终将它们转换为数据库的内置类型date
或datetime
数据类型。
如果不这样做,以后会非常非常痛苦地咬你。例如,假设如果它们保存为字符串,特别是如果它们采用不同的格式,则试图让数据库按日期顺序对它们进行排序。如果你可以确定一件事,当你在数据库中有一个日期时,你将需要根据给定日期、之后或之前的条目来查询它。如果您不需要对他们做那种事情,那么首先存储日期就没有多大意义了,所以即使您还没有被要求这样做,也可以将其视为给定的稍后会要求它。因此,始终始终将它们存储在正确的数据类型中,而不是作为 varchar。
接下来,您被要求处理的混合格式。
这是精神错乱。
我厌恶和厌恶 PHP 的strtotime()
功能。它很慢,有一些不幸的怪癖,通常应该被认为是过去的遗产而不被使用。但是,在这种情况下,它可能会为您提供帮助。
strtotime()
旨在接受未知格式的日期字符串,对其进行解析,并输出正确的时间戳。显然,它必须处理dd-mm-yyyy
和mm-dd-yyyy
格式两者的存在。它通过查看分隔符来猜测您所指的两者中的哪一个来做到这一点。
如果日期字符串使用斜杠作为分隔符,则假定格式为mm/dd/yyyy
. 如果它使用破折号,那么它假定dd-mm-yyyy
. strtotime()
这是在正常使用中使用这种痛苦的那些小怪癖之一。但这里是你的朋友。
它的工作方式实际上与您在问题中指定的格式完全相反。但这应该足以帮助您。如果您在输入字符串中切换斜杠和破折号,并将结果传递给strtotime()
它,则应根据您在问题中描述的方式在所有情况下产生正确的时间戳。
然后应该足够简单以将它们正确保存在数据库中。
但是,我强烈建议对此进行非常彻底的测试。如果它沿线的某个地方中断,也不会感到惊讶。如果您以不一致的格式提供数据,那么实际上没有任何方法可以保证它会始终不一致。您的程序基本上需要尽其所能处理不良数据。
您还需要对输入数据的质量提出一些严肃的问题。在这种情况下,不能指望任何程序能够可靠地工作。向提供它的人明确表示它不够好。如果程序因错误数据而中断,那是他们的错,而不是你的错。