Linux和Windows时间不一致问题

问题描述

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

解决办法

这个问题可以在Linux下解决

先用命令查看时区

timedatectl

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

image

设置时区,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

image

设置完重启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;
}
posted @   hywing  阅读(190)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示