首先:永远不会有史以来永远将日期或日期时间作为字符串存储在数据库中。
从来没有。
明白了吗?
您应该始终将它们转换为数据库的内置date
或datetime
数据类型。
未能做到这一点将在以后非常困难地咬你。例如,假设试图让数据库按照日期顺序对它们进行排序,如果它们保存为字符串的话,尤其是如果它们的格式不同。如果有一件事你可以确定,那么当你在数据库中有一个日期时,你将需要基于给定日期之后或之前的条目来查询它。如果你不需要和他们一起做这种事情,那么把日期存储在第一位就没有太多意义,所以即使你还没有被要求这样做,也要考虑它是一个给定的它会在稍后被要求。因此,总是总是总是将它们存储在正确的数据类型中,而不是作为varchar。
接下来,您已被要求处理的格式混合。
这是疯狂。
我厌恶和厌恶PHP的strtotime()
函数。它速度很慢,有一些不幸的怪癖,通常应该被认为是过去的遗产而没有被使用。但是,在这种情况下,它可能只是为了救援。
strtotime()
旨在接受未知格式的日期字符串,解析它并输出正确的时间戳。显然,它必须处理dd-mm-yyyy
和mm-dd-yyyy
格式的存在。它通过查看分隔符来猜测你的意思。
如果日期字符串使用斜杠作为分隔符,则它假定格式为mm/dd/yyyy
。如果它使用破折号,则它假定dd-mm-yyyy
。这是在正常使用中使用strtotime()
如此痛苦的那些小怪癖之一。但这里是你的朋友。
它的工作方式实际上与您在问题中指定的格式完全相反。但它应该足以帮助你。如果在输入字符串中切换斜杠和破折号,并将结果传递给strtotime()
,则它应根据您在问题中描述的方式在所有情况下生成正确的时间戳。
它应该足够简单,可以将它们正确保存在数据库中。
但是,我会强烈建议非常彻底地测试。如果它突破某个位置,不会感到惊讶。如果您以不一致的格式提供数据,那么确实没有办法确保它始终不一致。你的程序基本上需要尽可能地利用错误的数据。
您还需要提出一些有关输入数据质量的严重问题。在这种情况下,预计任何程序都不能可靠地工作。清楚地告诉谁提供它不够好。如果程序因数据不好而中断,那是他们的错,而不是你的。
您可以将其作为时间戳存储。使用'strtotime()'并将其作为int(10)放入数据库中。 –
'datetime'!='varchar' –
确定您在决定是否要使用'datetime'或''datetime''之前阅读[本文](http://stackoverflow.com/questions/409286/datetime-vs-timestamp) int'。 – Kermit