如何正确使用ctime()来打印不同的时间戳

时间:2016-04-29 00:39:58

标签: c++ ctime

我期望下面的代码应该打印不同的时间戳t1和t2,但是结果显示t1和t2是相同的。我在哪里弄错了?

<?php 

error_reporting(E_ALL);
ini_set('display_errors', 1);
session_start();

include_once 'includes/db.config.php';
$_SESSION['user'] = "Dennis";
$user = mysqli_real_escape_string($connection, $_SESSION['user']);

$sql = "SELECT last_ip, last_ua, ui_walks, ui_lastwalk, ui_walkstotal 
        FROM MyLog WHERE username='$user'";

$result = mysqli_query($connection, $sql) or die(mysqli_error($connection));

if (mysqli_num_rows($result) > 0) {

    while ($row = mysqli_fetch_assoc($result)) {
    $lastip = $row['last_ip'];
    $lastua = $row['last_ua'];
    $uiwalks = $row['ui_walks'];
    $uilastwalk = $row['ui_lastwalk'];
    $uiwalkstotal = $row['ui_walkstotal'];
    echo $lastip;
    }

} else {
// No results
echo "No results";
}
?>

结果:

#include<iostream>
#include<ctime>

using namespace std;

int main()
{
    time_t t1 = time(NULL);
    cout << "time now " << ctime(&t1) << endl;
    time_t t2 = t1 + 10000.0;
    cout << "time now " << ctime(&t1) << endl << " time later " << ctime(&t2) <<endl;
}

3 个答案:

答案 0 :(得分:4)

您的问题的答案可以在the manual page for the ctime() function

中找到
  

返回值指向静态分配的字符串   随后调用任何日期和时间都会被覆盖   功能

ctime()返回指向它使用的内部缓冲区的指针。每次调用它时,它都会返回一个指向同一缓冲区的指针:

 cout << "time now " << ctime(&t1) << endl << " time later " << ctime(&t2) <<endl;

对于这行代码,您的编译器生成的代码调用ctime()两次,然后执行<<运算符。但是在第二次调用ctime()时,它第二次覆盖缓冲区,所以当<<运算符格式化输出时,因为第一次调用ctime()的结果是相同的指针,以及它指向的缓冲区已被第二次调用ctime()覆盖,你得到同样的时间打印两次。

感谢您发布Minimal, Complete, and Verifiable example

答案 1 :(得分:3)

ctime实际返回的是什么?来自cppreference

  

指向包含日期和时间的文本表示的静态以空字符结尾的字符串的指针。 字符串可以在std::asctimestd::ctime之间共享,并且可以在每次调用任何这些函数时被覆盖。

在你的编译器上可能会发现,后来ctime()被调用,然后是较新的ctime(),然后两个operator<<()被评估 - 它们发出相同的{{1} }}。由于未指定的顺序,您的代码具有未定义的行为。在某些编译器上,它可以像你希望的那样工作!在你的身上,它不会发生。

如果您将两个电话分开:

char*

你一定会一直看到不同的价值观。

答案 2 :(得分:2)

引自N1570 7.27.3时间转换功能:

  

除了strftime函数之外,这些函数都返回指向两个函数之一的指针   静态对象的类型:分解的时间结构或char数组。执行   返回指向这些对象类型之一的指针的任何函数都可能会覆盖   从any返回的值指向的任何相同类型的对象中的信息   以前调用它们中的任何一个并不需要这些函数来避免数据争用   彼此。

这表明.imageshow返回的内容所指向的内容可以被另一个ctime()调用覆盖,因此您必须复制结果才能将结果用于一个没有序列的表达式中指出。

试试这个:

ctime()