问题描述

装过双系统或者虚拟机装Linux的人都知道,Linux的时间和Windows往往是不同步的,在编写跨平台程序的时候特别是对时间敏感的代码就带来很大的困扰

解决办法

这个问题可以在Linux下解决

先用命令查看时区

timedatectl 

如果系统刚刚装好,没有设置好时区,有可能默认的是America/Los_Angeles

timesync.png

设置时区,Asia/Shanghai代表UTC东8区时间

timedatectl set-timezone "Asia/Shanghai"

Linux下获取时间

main.cpp

#include <iostream>
#include <ctime>

using namespace std;

int main()
{
    setenv("TZ", "/usr/share/zoneinfo/Asia/Shanghai", 1);
    auto t = time(nullptr);
    struct tm tm = *localtime(&t);
    printf("time zone : %s -> %s", getenv("TZ"), asctime(&tm));
    auto ti = mktime(&tm);
    std::cout << "time : " << ti << std::endl;
    return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.5)

project(get-time LANGUAGES CXX)

set(CMAKE_CXX_STANDARD_REQUIRED ON)

add_executable(${PROJECT_NAME} main.cpp)

使用VMware Workstation进行时间同步

如果你是虚拟机用户,你可以在VMware Workstation面板点击虚拟机 -> 设置 -> 选项 -> VMware Tools

timesync.png

设置完重启Linux就会发现时间已经同步好了

Windows下获取时间

中文电脑一般默认UTC东八区时间,如果不是请自行了解怎么设置,以下是示范例程

#include <iostream>
#include <windows.h>
#include <ctime>

using namespace std;

inline int get_time(struct timeval *tp, void *tzp)
{
    time_t clock;
    struct tm tm;
    SYSTEMTIME wtm;
    GetLocalTime(&wtm);
    tm.tm_year   = wtm.wYear - 1900;
    tm.tm_mon   = wtm.wMonth - 1;
    tm.tm_mday   = wtm.wDay;
    tm.tm_hour   = wtm.wHour;
    tm.tm_min   = wtm.wMinute;
    tm.tm_sec   = wtm.wSecond;
    tm. tm_isdst  = -1;
    clock = mktime(&tm);
    tp->tv_sec = clock;
    tp->tv_usec = wtm.wMilliseconds * 1000;
    return (0);
}

int main()
{
    struct timeval tv;
    get_time(&tv,NULL);

    time_t unix_second = (tv.tv_sec);
    return 0;
}