首页 > 系统相关 >Linux和Windows时间不一致问题

Linux和Windows时间不一致问题

时间:2023-12-03 15:31:42浏览次数:36  
标签:Windows Linux tv tm 一致 time include wtm

问题描述

装过双系统或者虚拟机装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

<img src="../resource/iotstuff/linux/timesync.png" style="zoom:70%;" align="left"/>

设置完重启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;
}

标签:Windows,Linux,tv,tm,一致,time,include,wtm
From: https://blog.51cto.com/hywing/8668499

相关文章

  • linux/centos使用fail2ban实现计次登录失败封禁其ip
    问题背景使用命令 cat/var/log/secure 查询服务器登录记录,发现有ip在进行暴力破解所以使用fail2ban进行ip限制,如果登录失败五次,则永久封禁其ip。安装并配置fail2ban(来自ChatGPT)下面是一份完整的Fail2Ban安装和配置,用于监视SSH服务并在登录失败5次时永久封锁相关IP的配置。......
  • linux文件系统管理和磁盘管理
    环境centos7.9文件系统挂载与卸载在Linux中,文件系统是通过挂载到目录上来使用的。挂载文件系统就是把一个文件系统和一个目录联系起来,使得用户可以通过这个目录来访问文件系统中的内容。文件系统挂载可以使用mount命令来实现挂载目录,如把/dev/sda1文件系统挂载到/mnt/mydisk目......
  • Linux 分区
    1、磁盘寻址方式(MBR)若按照上述分区则linux/dev文件下的硬盘设备应该为:/dev/sda1/dev/sda2/dev/sda3/dev/sda5/dev/sda6/dev/sda7其中sda4不见了是因为它作为了扩展分区,其实也就是包括了sda5~sda7统称扩展分区。 例题:  2、GPT分区表原理    ......
  • 2023年更新整理Windows11专业工作站版激活密钥
    微软Windows11官方ISO镜像下载地址:https://www.microsoft.com/zh-cn/software-download/windows11激活密钥(整理自互联网,不保证可用性):MJN6F-M8XD9-R84JM-P8P8W-J8C9KP2Q5A-B6C8D-F9G1H-J3K7L-N4M6PR7T1Y-U2V5W-X4Z8A-D6E9F-K3G7HL9N2D-H3P7Q-V8R4X-U5C1S-J6K9MS4W6J-K7U9L-C3V8X-Y1Z......
  • Linux服务器账号多次输入错误密码后解锁
    pam_tally2模块用于对系统进行失败的ssh登录尝试后锁定用户帐户。此模块保留已尝试访问的计数和过多的失败尝试。 查看用户登录失败的信息pam_tally2-urootLoginFailuresLatestfailureFromroot812/3/23 13:18:19192.168.7.49注:Failures表示登录系统失败的次数......
  • Windows驱动中数字签名认证(使用 ci.dll)
    1.背景  对于常规应用程序来说,在应用层可以使用WinVerifyTrust,在驱动层使用常规的API无法使用,自己分析数据又太麻烦。  但在内核中ci.dll包装了数据签名验证相关的功能,我们可以使用该dll来实现我们的数字签名验证。  详细的分析见《内核中的代码完整性:深入分析ci......
  • Linux第14章学习笔记
    第十四章学习笔记mysql简介MySQL是一个开源数据库管理系统,由服务器和客户机组成。在将客户机连接到服务器后,用户可向服务器输入SQL命令,以便创建数据库,删除数据库,存储、组织和检索数据库中的数据。MySQL有广泛的应用。安装MySQL在Ubuntu中,使用命令sudoaptinstallmysql-serv......
  • 【Docker】Linux路由连接两个不同网段namespace,连接namespace与主机
    如果两个namespace处于不同的子网中,那么就不能通过bridge进行连接了,而是需要通过路由器进行三层转发。然而Linux并未像提供虚拟网桥一样也提供一个虚拟路由器设备,原因是Linux自身就具备有路由器功能。路由器的工作原理是这样的:路由器上有2到多个网络接口,每个网络接口处于不同的三层......
  • Linux命令(112)之tac
    linux命令之tac1.tac介绍linux命令tac是将文件内容反向输出,其与命令cat输出刚好相反2.tac用法tac[参数]filenametac参数参数说明--version显示版本信息--help显示帮助信息3.实例3.1.显示tac的版本信息命令:tac--version[root@rhel77~]#tac--versiontac(GNUcoreutils)......
  • Linux命令(111)之groupadd
    linux命令之groupadd1.groupadd介绍linux命令groupadd是用来创建新的用户组,用户组信息会被添加到系统文件(/etc/group)中。2.groupadd用法groupadd[参数]GroupNamegroupadd常用参数参数说明-g指定用户组的gid号-r创建系统工作组-f如果组已经存在则成功退出3.实例3.1.创建普......