mktime()转换为mysql日期时间列


mktime() into mysql datetime column?

我不知道这是否可能,但当使用循环将输入数据库时,我正在尝试为每个用户分配不同的日期(我知道这是可能的)。为了做到这一点,我使用mktime()构建时间戳,但我的列是datetime(出于MySQL ORDERBY时间戳DESC的目的),自然,这两者不在一起。

我的代码:

<?php
    foreach($arr as $user_uid => $num) {
      $i = 1;
        while($num > 0) {
          $i++;
          $t = new DateTime("Y-m-d H:i:s", date(mktime(0, 0, 0, $i, 1, 2012)));
          $num--;
        }
     }
?>

此时返回:0000-00-00 00:00:00。

任何帮助都将不胜感激,谢谢!

编辑:金额发生了变化,我的代码现在是这样的:

foreach($arr as $user_uid => $num) {
    $i = 1;
        while($num > 0) {
            $i++;
            $t = date('Y-m-d H:i:s', mktime(0, 0, 0, $i, 1, 2012));
            $num--;
        }
$game = "INSERT INTO wd_game_$gid (game_uid,user_uid,lastmove,startcountry,money) VALUES ('$gid','$user_uid',FROM_UNIXTIME('$t'),'$rand_c','$money')";

现在插入:1970-01-01 00:00:00

解决方案1-在数据库层上使用FROM_UNIXTIME()

您可以使用FROM_UNIXTIME()函数在数据库端执行此操作(参数是Unix epoch时间戳,因此这与mktime()的结果相同)。

解决方案2-修复当前代码

此外,您的代码也是不正确的,因为您将不正确的日期传递给了DateTime构造函数(请参阅文档)。传递"Y-m-d H:i:s"而不是date('Y-m-d H:i:s', mktime(0, 0, 0, $i, 1, 2012))。您甚至可以放弃使用DateTime,而只使用date('Y-m-d H:i:s', mktime(0, 0, 0, $i, 1, 2012)),因为这对于您的数据库插入来说已经足够了。

我认为你的方法不太正确。尝试:

foreach($arr as $user_uid => $num) {
  $i = 1;
    while($num > 0) {
      $i++;
      $t = date("Y-m-d H:i:s", mktime(0, 0, 0, $i, 1, 2012));
      $num--;
    }
 }

DateTime()构造函数有两个可选参数。一个表示时间的字符串和一个表示时区的字符串-请参阅DateTime__construct引用

应该是

$t = new DateTime(date("Y-m-d H:i:s", mktime(0, 0, 0, $i, 1, 2012)));

(格式字符串是date的第一个参数)


EDIT:正如我在评论中所说,不要将phpDateTime类与MySQL DateTime数据类型混淆。

你可以这样做:

$t = mktime(0, 0, 0, $i, 1, 2012);  // $t contains now a unix timestamp
// ... 
$game = "INSERT INTO wd_game_$gid (game_uid,user_uid,lastmove,startcountry,money) VALUES ".
        "('$gid','$user_uid',FROM_UNIXTIME($t),'$rand_c','$money')";

或者这个:

$t = date("Y-m-d H:i:s", mktime(0, 0, 0, $i, 1, 2012));
// $t contains a textual representation of MySQL DATETIME value
// ... 
$game = "INSERT INTO wd_game_$gid (game_uid,user_uid,lastmove,startcountry,money) VALUES ".
        "('$gid','$user_uid','$t','$rand_c','$money')";

我不明白为什么您必须将日期的字符串表示传递给FROM_UNIXTIME函数,因为您已经使用了DATETIME数据类型。FROM_UNIXTIME参数为无符号整数,因此评估结果1970为年份,相当于历元的开始

foreach($arr as $user_uid => $num) {
$i = 1;
    while($num > 0) {
        $i++;
        $t = date('Y-m-d H:i:s', mktime(0, 0, 0, $i, 1, 2012));
        $num--;
    }
$game = "INSERT INTO wd_game_$gid (game_uid,user_uid,lastmove,startcountry,money) VALUES      ('$gid','$user_uid','$t','$rand_c','$money')";