将PHP日期转换为MySQL格式

58

我在php中有一个日期字段,它使用以下代码:

$date = mysql_real_escape_string($_POST['intake_date']);

如何将这个日期转换为 MySql 格式 0000-00-00 以便在数据库中使用。是这样吗:date('Y-m-d' strtotime($date));。我问这个问题的原因是,我尝试了这种变化,但似乎无法使它起作用。会显示为 1970 年或其他一些变体。非常感谢。


7
$_POST['intake_date'] 目前的格式是什么?我猜 MySQL 的列类型是 DATE,可以确认吗? - Bojangles
原始日期是Unix时间戳吗?(看起来像139293929的东西) - Jakub
@jakub 不是,它是0000-00-00 00:00:00。 - bollo
9个回答

152
$date = mysql_real_escape_string($_POST['intake_date']);

1. 如果你的 MySQL 列是 DATE 类型:

$date = date('Y-m-d', strtotime(str_replace('-', '/', $date)));

2. 如果您的MySQL列是DATETIME类型:

$date = date('Y-m-d H:i:s', strtotime(str_replace('-', '/', $date)));

你不必使用 strtotime(),因为它无法处理破折号 - 分隔符,它会尝试进行减法操作。


更新,由于你的日期格式化方式,不能使用 strtotime(),请改用以下代码:

$date = '02/07/2009 00:07:00';
$date = preg_replace('#(\d{2})/(\d{2})/(\d{4})\s(.*)#', '$3-$2-$1 $4', $date);
echo $date;

输出:

2009-07-02 00:07:00

@bollo:你试过我的代码了吗?给我一个样本日期时间来测试,但我怀疑它会正常工作。 - Shef
@bollo:你的日期格式化方式不支持使用 strtotime() 函数。我更新了我的答案。请检查更新部分的代码。 - Shef
我对 preg_replace 不是很了解。这段代码到底是在做什么?另外,我的日期格式为什么不同?我在其他页面上使用这个格式没有问题。作为一个测试,我通过 firebug json 发送了响应,结果是:"date": "2009-02-07 00:07:00",所以它没有正确地到达数据库。谢谢。 - bollo
@bollo:你现在的日期格式是DD/MM/YYYY,应该改成MM/DD/YYYY才能与strtotime()一起使用。上面的preg_replace()将把日期格式化为我展示的输出样式。也许你发送回了错误的变量,因为我刚刚仔细检查了一下,它正在响应你想要的日期格式化方式。 - Shef
preg_replace基本上是在字符串上进行正则表达式查找和替换 - 您可以指定要查找/替换的字符串数量以及要进行多少次替换的限制 :) - John Humphreys
显示剩余4条评论

17

这个网站提供了两种相当简单的解决方案——只需检查代码,我提供了描述以防您需要,可以省去一些点击。

http://www.richardlord.net/blog/dates-in-php-and-mysql

1.一个常见的解决方案是将日期存储在 DATETIME 字段中,并使用 PHP 的 date() 和 strtotime() 函数在 PHP 时间戳和 MySQL DATETIME 之间进行转换。方法如下所示 -

$mysqldate = date( 'Y-m-d H:i:s', $phpdate );
$phpdate = strtotime( $mysqldate );

2.我们的第二个选择是让MySQL来完成工作。MySQL有一些我们可以使用的函数,在我们访问数据库时将数据转换为所需格式。UNIX_TIMESTAMP可以将DATETIME转换为PHP时间戳,而FROM_UNIXTIME则可以将PHP时间戳转换为DATETIME。这些方法在SQL查询中使用。因此,我们可以使用以下查询来插入和更新日期 -

$query = "UPDATE table SET
    datetimefield = FROM_UNIXTIME($phpdate)
    WHERE...";
$query = "SELECT UNIX_TIMESTAMP(datetimefield)
    FROM table WHERE...";

我使用以下代码:$date = mysql_real_escape_string($_POST['intake_date']); $newdate = date('Y-m-d H:i:s', strtotime($date)); 但是它似乎将其放在了数据库中的YYYY-dd-mm 00:00:00。日期和月份似乎被颠倒了。谢谢。 - bollo
说实话,我不完全确定为什么会发生这种情况 - 我会考虑一下并回复你,除非有人比我更快 - 对此感到抱歉! - John Humphreys

6

如果您的日期格式为dd/mm/yyyy,请使用以下格式:

$date = explode('/', $_POST['posted_date']);
$new_date = $date[2].'-'.$date[1].'-'.$date[0];

如果您的日期格式为mm/dd/yyyy,只需更改第二行:
$new_date = $date[2].'-'.$date[0].'-'.$date[1];

5
您需要使用MySQL函数FROM_UNIXTIME()UNIX_TIMESTAMP()。 在SQL中使用它们,例如:
mysql> SELECT UNIX_TIMESTAMP(NOW());
+-----------------------+
| UNIX_TIMESTAMP(NOW()) |
+-----------------------+
|            1311343579 |
+-----------------------+
1 row in set (0.00 sec)

mysql> SELECT FROM_UNIXTIME(1311343579);
+---------------------------+
| FROM_UNIXTIME(1311343579) |
+---------------------------+
| 2011-07-22 15:06:19       |
+---------------------------+
1 row in set (0.00 sec)

5
如果 intake_date 是一些常见的日期格式,你可以使用 date()strtotime() 函数。
$mysqlDate = date('Y-m-d H:i:s', strtotime($_POST['intake_date']));

然而,这只有在日期格式被strtotime()函数接受的情况下才有效。请参考文档页面以查看支持的格式。


3

PHP 5.3有函数可以根据您指定的任何格式创建和重新格式化DateTime对象:

$mysql_date = "2012-01-02";   // date in Y-m-d format as MySQL stores it
$date_obj = date_create_from_format('Y-m-d',$mysql_date);
$date = date_format($date_obj, 'm/d/Y');
echo $date;

输出:

01/02/2012

MySQL还可以通过在插入/更新时使用STR_TO_DATE()函数和在查询时使用DATE_FORMAT()来控制格式。

$php_date = "01/02/2012";
$update_query = "UPDATE `appointments` SET `start_time` = STR_TO_DATE('" . $php_date . "', '%m/%d/%Y')";
$query = "SELECT DATE_FORMAT(`start_time`,'%m/%d/%Y') AS `start_time` FROM `appointments`";

2
function my_date_parse($date)
{
        if (!preg_match('/^(\d+)\.(\d+)\.(\d+)$/', $date, $m))
                return false;

        $day = $m[1];
        $month = $m[2];
        $year = $m[3];

        if (!checkdate($month, $day, $year))
                return false;

        return "$year-$month-$day";
}

1
如果您知道 $_POST[intake_date] 中日期的格式,您可以使用 explode 函数获取年、月和时间,然后连接起来形成有效的 MySQL 日期。例如,如果您得到的是类似于 12/15/1988 的日期,您可以这样做:
    $date = explode($_POST['intake_date'], '/');
    mysql_date = $date[2].'-'$date[1].'-'$date[0];

虽然如果您有有效的日期,date('y-m-d', strtotime($date)); 也应该可以工作


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接