我认为将日期时间值保留在类型字段中将是一种自然的方式。DATETIME
根据我自己对当前PHP应用程序的经验,仅/与此信息有关的操作可能会有问题。read
write
正确执行整个过程的可能解决方案之一(假设您使用数据类型)可能是以下方法:DATETIME
读取 PHP 使用的 DATETIME 值
- 从数据库中获取字段,通过使用MySQL函数和格式化字符串的形式,以查询中的字段转换为字符串表示形式(DATE_FORMAT
DATETIME
'2011-10-02T23:25:42Z'
DATE_FORMAT
'%Y-%m-%dT%H:%i:%sZ'
)
- 以这种特定格式读取提取的列值,并在PHP中将其从字符串转换为对PHP有效的真实日期时间表示(例如类对象和给定格式化字符串的静态方法(并且被转义以避免将它们视为格式化指令)(该方法的文档)。
DateTime
DateTime::createFromFormat
'Y-m-d\TH:i:s\Z'
T
Z
- 使用转换后的值作为所有适用逻辑的真实日期时间值,例如实际日期比较(不是文本比较)等。
将 PHP 日期时间写入 MySQL 数据库
- 即.PHP,使用类对象的方法将类对象转换为我们的ISO 8601 UTC格式的字符串表示,其格式与格式化字符串(文档)之前相同。
DateTime
DateTime
format
'Y-m-d\TH:i:s\Z'
- 使用这种准备好的字符串作为MySQL函数(带格式化字符串)的参数对数据库信息执行/操作,将其转换为实际数据库值(STR_TO_DATE上的文档)。
INSERT
UPDATE
STR_TO_DATE
'%Y-%m-%dT%H:%i:%sZ'
DATETIME
PHP 中的示例代码
下面请找到使用PDO对象的这种方法的草稿示例:
$db = new PDO('mysql:host=localhost;dbname=my_db;charset=utf8', 'username', 'password');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try {
// run the query aquring 1 example row with DATETIME data
// converted with MySQL DATE_FORMAT function to its string representation
// in the chosen format (in our case: ISO 8601 / UTC)
$stmt = $db->query("SELECT DATE_FORMAT(dt_column, '%Y-%m-%dT%H:%i:%sZ') AS formatted_dt_col"
." FROM your_table LIMIT 1");
if($stmt !== FALSE) {
$row = $stmt->fetch(PDO::FETCH_ASSOC);
// convert the acquired string representation from DB
// (i.e. '2011-10-02T23:25:42Z' )
// to PHP DateTime object which has all the logic of date-time manipulation:
$dateTimeObject = DateTime::createFromFormat('Y-m-d\TH:i:s\Z', $row['formatted_dt_col']);
// the following should print i.e. 2011-10-02T23:25:42Z
echo $dateTimeObject->format('Y-m-d\TH:i:s\Z');
// now let's write PHP DateTime class object '$dateTimeObject'
// back to the database
$stmtInsertDT = $db->prepare("INSERT INTO your_table(dt_column) "
. " VALUES ( STR_TO_DATE(:par_formatted_dt_column, '%Y-%m-%dT%H:%i:%sZ') )");
$dtAsTextForInsert = $dateTimeObject->format('Y-m-d\TH:i:s\Z');
// convert '$dateTimeObject' to its ISO 8601 / UTC text represantation
// in order to be able to put in in the query using PDO text parameter
$stmtInsertDT->bindParam(':par_formatted_dt_column', $dtAsTextForInsert, PDO::PARAM_STR);
$stmtInsertDT->execute();
// So the real insert query being perform would be i.e.:
/*
INSERT INTO your_table(dt_column)
VALUES ( STR_TO_DATE('2011-10-02T23:25:42Z', '%Y-%m-%dT%H:%i:%sZ') )
*/
}
}
catch(\PDOException $pexc) {
// serve PDOException
}
catch(\Exception $exc) {
// in case of no-PDOException, serve general exception
}
这种方法在PHP和MySQL数据库之间操作日期时间值方面帮助了我很多。
我希望它也可能对你有所帮助。