0

我的任务是通过 PHP 从 csv 文件中读取日期时间并将它们存储在 mysql 数据库中。csv 文件中的日期时间有两种格式,第一种是. DD/MM/YYYY HH:mm:ss AM/PM,第二种是MM-DD-YYYY HH:mm:ss AM/PM. 然后,我需要选择一些行,因为它们的日期时间在某个时期。

似乎有点困惑。我脑子里有几个问题:

  1. 在 mysql 表中设置 varchar 类型来存储它们很容易。但是以后很难选择一些行,因为我需要先将字符串转换为日期时间并检查数据是否在特殊时期。

  2. 另一种解决方案是在存储到数据库之前通过 PHP 将这些日期时间从字符串转换为日期时间。然后很容易以后选择数据。但第一步也有点复杂。

我不知道有人对这个问题有什么好的想法,或者在类似问题上的一些经验。

4

1 回答 1

1

首先:永远不要 数据库中的日期或日期时间存储为字符串。

绝不。

了解?

您应该始终将它们转换为数据库的内置类型datedatetime数据类型。

如果不这样做,以后会非常非常痛苦地咬你。例如,假设如果它们保存为字符串,特别是如果它们采用不同的格式,则试图让数据库按日期顺序对它们进行排序。如果你可以确定一件事,当你在数据库中有一个日期时,你将需要根据给定日期、之后或之前的条目来查询它。如果您不需要对他们做那种事情,那么首先存储日期就没有多大意义了,所以即使您还没有被要求这样做,也可以将其视为给定的稍后会要求它。因此,始终始终将它们存储在正确的数据类型中,而不是作为 varchar。

接下来,您被要求处理的混合格式。

这是精神错乱。

我厌恶和厌恶 PHP 的strtotime()功能。它很慢,有一些不幸的怪癖,通常应该被认为是过去的遗产而不被使用。但是,在这种情况下,它可能会为您提供帮助。

strtotime()旨在接受未知格式的日期字符串,对其进行解析,并输出正确的时间戳。显然,它必须处理dd-mm-yyyymm-dd-yyyy格式两者的存在。它通过查看分隔符来猜测您所指的两者中的哪一个来做到这一点。

如果日期字符串使用斜杠作为分隔符,则假定格式为mm/dd/yyyy. 如果它使用破折号,那么它假定dd-mm-yyyy. strtotime()这是在正常使用中使用这种痛苦的那些小怪癖之一。但这里是你的朋友。

它的工作方式实际上与您在问题中指定的格式完全相反。但这应该足以帮助您。如果您在输入字符串中切换斜杠和破折号,并将结果传递给strtotime()它,则应根据您在问题中描述的方式在所有情况下产生正确的时间戳。

然后应该足够简单以将它们正确保存在数据库中。

但是,我强烈建议对此进行非常彻底的测试。如果它沿线的某个地方中断,也不会感到惊讶。如果您以不一致的格式提供数据,那么实际上没有任何方法可以保证它会始终不一致。您的程序基本上需要尽其所能处理不良数据。

您还需要对输入数据的质量提出一些严肃的问题。在这种情况下,不能指望任何程序能够可靠地工作。向提供它的人明确表示它不够好。如果程序因错误数据而中断,那是他们的错,而不是你的错。

于 2012-08-30T21:59:03.343 回答