【问题标题】:strtotime and date not outputting correctlystrtotime 和日期未正确输出
【发布时间】:2016-08-29 19:12:21
【问题描述】:

我无法为数据库中保存的日期回显正确的 unix 时间戳。

$activeWorkRow['WorkDate'] = "9/24/2015 1:45:53 PM";
$locateDate = $activeWorkRow['WorkDate'];
$locateDate = str_replace('/', '-', $locateDate);
//$locateDate = date('m-d-Y', strtotime($locateDate));
//$locateDate = strtotime(date($locateDate));

echo $locateDate."<br>";

输出:

9-24-2015 1:45:53 PM

下一个:

$locateDate = $activeWorkRow['WorkDate'];
$locateDate = str_replace('/', '-', $locateDate);
$locateDate = date('m-d-Y', strtotime(locateDate));
//$locateDate = strtotime(date($locateDate));

输出:

12-31-1969

我正在尝试获取 unix 时间戳,以便与其他人进行比较。

【问题讨论】:

  • 您的服务器在哪个时区?

标签: php date strtotime


【解决方案1】:

您的问题是str_replace('/', '-', $locateDate);。您的日期以m/d/y 给出,并且通过替换您将其转换为m-d-y

strtotime- 视为欧洲d-m-y 格式的指标。在这种格式中,9/24/2015 不是有效日期,导致您观察到的输出(等于 date('m-d-Y', 0))。

直接跳过str_replace

$activeWorkRow['WorkDate'] = "9/24/2015 1:45:53 PM";
$locateDate = $activeWorkRow['WorkDate'];
echo strtotime($locateDate);

输出:

1443116753

参照。 the manual 了解更多详情和注意事项:

m/d/y 或 d-m-y 格式的日期可以通过查看来消除歧义 各个组件之间的分隔符:如果分隔符是 斜线 (/),则假定为美式 m/d/y;而如果 分隔符是破折号 (-) 或点 (.),然后是欧洲 d-m-y 格式 假设。但是,如果年份以两位数格式给出,并且 分隔符是一个破折号(-,日期字符串被解析为 y-m-d。

请注意,在显示这些时间戳时,您可能还需要考虑时区(strtotime 使用默认值,除非另有说明),但只要您只比较由同一函数生成的时间戳,您应该没问题。

【讨论】:

    【解决方案2】:

    如果你使用 MySQL,你可以说:

    mysql> SELECT UNIX_TIMESTAMP();

    <?php  
    $hostname="your_hostname";  
    $username="your_username";  
    $password="your_password";  
    $db = "your_dbname";   
    $dbh = new PDO("mysql:host=$hostname;dbname=$db", $username, $password);  
    foreach($dbh->query('SELECT UNIX_TIMESTAMP()') as $row) {  
        echo "<tr>";  
        echo "<td>" . $row['UNIX_TIMESTAMP()'] . "</td>";   
        echo "</tr>";  
    }  
    ?>
    

    或者如果您需要指定日期的 Unix Stamp 时间,请尝试:

    mysql> SELECT UNIX_TIMESTAMP('2016-01-01 12:00:00');

    <?php  
    $hostname="your_hostname";  
    $username="your_username";  
    $password="your_password";  
    $db = "your_dbname";  
    $dbh = new PDO("mysql:host=$hostname;dbname=$db", $username, $password);  
    foreach($dbh->query('SELECT UNIX_TIMESTAMP("2016-01-01 12:00:00")') as $row) {  
        echo "<tr>";  
        echo "<td>" . $row['UNIX_TIMESTAMP("2016-01-01 12:00:00")'] . "</td>";  
        echo "</tr>";  
    }  
    ?>  
    

    【讨论】:

    • 它是使用 varchar 而不是 datetime 存储的。我认为这就是为什么我得到一个 0 而不是它应该输出的原因
    • 你可以在这个函数中输入一个varchar:SELECT UNIX_TIMESTAMP($activeWorkRow['WorkDate'])
    • $timestamp = strtotime($mysqltime); echo date("Y-m-d H:i:s", $timestamp);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-05
    • 2012-09-21
    相关资源
    最近更新 更多