我可以用其他方式从C ++中获取时间吗?

时间:2017-03-22 14:06:13

标签: c++ c++11

$B2::create(array_merge(request()->all(), ['column9' => 'text']));

为什么我会收到警告

  

警告C4996:'localtime':此函数或变量可能不安全。请考虑使用localtime_s。要禁用弃用,请使用_CRT_SECURE_NO_WARNINGS。

有没有其他方式可以节省时间[小时:分钟:秒],是否可以将string GetTime() { time_t Timev; struct tm * TimeInformation; time(&(time_t)Timev); (tm*)TimeInformation = localtime(&(time_t)Timev); char Timec[100]; strftime((char*)Timec, 100, "[%X]:", (tm*)TimeInformation); string GetTimex((char*)Timec); return GetTimex; }; 等代码缩短为int abc; abc=123

4 个答案:

答案 0 :(得分:4)

如果您愿意安装Howard Hinnant的免费开源tz library,那么GetTime()可以简化为:

#include "tz.h"
#include <string>

std::string
GetTime()
{
    using namespace std::chrono;
    using namespace date;
    return format("[%X]:", make_zoned(current_zone(), system_clock::now()));
}

这只是我的输出:

[10:42:32]:

以下是installation directions(包括Windows版)。

答案 1 :(得分:2)

您可以使用this example

#include <iostream>
#include <iomanip> // std::put_time
#include <ctime>   // std::localtime, std::time, std::time_t, std::gmtime

int main()
{
    std::time_t t = std::time(nullptr);
    std::cout << "UTC:   " << std::put_time(std::gmtime(&t), "%X") << '\n';
    std::cout << "local: " << std::put_time(std::localtime(&t), "%X") << '\n';
}

可能的输出:

UTC:   14:18:02
local: 14:18:02

然后你的GetTime会:

std::string GetTime()
{
    std::time_t t = std::time(nullptr);
    std::stringstream ss;
    ss << std::put_time(std::localtime(&t), "[%X]");
    return ss.str();
}

答案 2 :(得分:1)

localtime有一个静态的内部存储,这意味着它不是线程安全的。大多数系统都有线程安全的替代品,但它们不是标准库的一部分。例如,Windows具有localtime_s,Linux / Posix具有localtime_r。 std库函数std :: strftime和std :: put_time可能是更安全的替代方法,如this article

中所述

答案 3 :(得分:1)

std::localtime()(当它成功时)的返回值是

  

指向静态内部std::tm对象的指针

此外,

  

结构可以在std::gmtimestd::localtimestd::ctime之间共享,也可以在每次调用时覆盖。

来自cppreference

这意味着如果您在其他线程中使用这些函数中的任何一个,则可能会出现数据竞争。如果您确定没有其他线程正在使用任何这些函数(可能是因为您的程序是单线程的),那么您可以放心地忽略该警告。

您的编译器似乎建议您使用其实现定义的替代方案 - 您是否愿意接受,但您可能需要考虑隔离随后引入的任何平台依赖项。