32位旧内核2038溢出time记录

news2024/9/24 11:30:56

        项目中有使用arm32的机器 现在内核动不了 有个使用时间范围显示是2023-2123

int在32bit下的 2038危机诞生了。

下面在svn找到代码 优化了一下 供大家学习哈,废话不多说直接上家伙:

需要的函数自己抄


#pragma once
#include <stdio.h>
#include <time.h>
#include <chrono>
#include <iostream>
#include <ctime>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <random>

//类型定义
using time64 = long long;

//解决32bit系统mktime的溢出问题
time64 mkTime64(struct tm* mk)
{
    using TIME_DEF = enum
    {
        SEC = 1,
        MIN = SEC * 60,
        HOUR = MIN * 60,
        DAY = HOUR * 24,
        YEAR = DAY * 365,
    };

    time64 time_difference = 8 * HOUR;

    static time64 mon_yday[2][12] =
    {
        {0,31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334},
        {0,31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335},
    };

    auto leap = [](int year)->int
    {
        if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0))
            return 1;
        return 0;
    };

    auto get_day = [](time64 year)->time64
    {
        year = year - 1;
        time64 leap_year_num = year / 4 - year / 100 + year / 400;
        time64 tol_day = year * 365 + leap_year_num;
        return tol_day;
    };

    auto mymktime = [&](int year, int mon, int day, int hour, int min, int sec)->time64
    {
        time64 tol_day = 0;
        mon -= 1;
        //year += 1900;
        tol_day = get_day(year) - get_day(1970) + mon_yday[leap(year)][mon] + day - 1;
        time64 ret = tol_day * TIME_DEF::DAY + hour * TIME_DEF::HOUR + min * TIME_DEF::MIN + sec * TIME_DEF::SEC - time_difference;
        return ret;
    };

    if (!mk)
        return -1;
    if (!(mk->tm_sec >= 0 && mk->tm_sec <= 59))
        return -1;
    if (!(mk->tm_min >= 0 && mk->tm_min <= 59))
        return -1;
    if (!(mk->tm_hour >= 0 && mk->tm_hour <= 23))
        return -1;
    if (!(mk->tm_mday >= 1 && mk->tm_hour <= 31))
        return -1;
    if (!(mk->tm_mon >= 0 && mk->tm_mon <= 11))
        return -1;
    if (!(mk->tm_year >= 70))
        return -1;
    return mymktime(mk->tm_year, mk->tm_mon, mk->tm_mday, mk->tm_hour, mk->tm_min, mk->tm_sec);
}

//解决32bit系统localtime的溢出问题
struct tm* localTime64(const time64* timer)
{
    static struct tm tmz;
#define CHCK_IS_LEAP_YEAR(y)  (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0))
    int startYear = 1970;
    time64 iTimep = *timer;
    iTimep += 8 * 3600;

    tmz.tm_sec = iTimep % 60;
    tmz.tm_min = ((iTimep - tmz.tm_sec) / 60) % 60;
    tmz.tm_hour = (((iTimep - tmz.tm_sec) / 60 - tmz.tm_min) / 60) % 24;
    int _alldays = (((iTimep - tmz.tm_sec) / 60 - tmz.tm_min) / 60 - tmz.tm_hour) / 24;
    tmz.tm_wday = _alldays % 6 + 1;
    tmz.tm_isdst = 0;
    tmz.tm_year = _alldays / 365 + startYear;

    int _ndays = 0;
    for (int i = startYear; i < tmz.tm_year; i++)
    {
        if (CHCK_IS_LEAP_YEAR(i))
            _ndays += 366;
        else
            _ndays += 365;
    }
    int k, leap;
    int yearday = _alldays - _ndays;
    tmz.tm_yday = yearday;
    int _months_days[2][13] =
    {
        {0,31,28,31,30,31,30,31,31,30,31,30,31},
        {0,31,29,31,30,31,30,31,31,30,31,30,31}
    };
    if (CHCK_IS_LEAP_YEAR(tmz.tm_year))
        leap = 1;
    else
        leap = 0;
    for (k = 1; yearday > _months_days[leap][k]; k++)
        yearday -= _months_days[leap][k];
    tmz.tm_mon = k;
    tmz.tm_mday = yearday + 1;
    return &tmz;
}

//时间戳->"yyyy-mm-dd HH:MM:SS"
std::string TimeToStr(time_t timer)
{
    std::stringstream ss;
    auto tm = std::localtime(&timer);
    ss << std::put_time(tm, "%Y-%m-%d %H:%M:%S");
    return ss.str();
}

//"yyyy-mm-dd HH:MM:SS"->时间戳
time_t StrToTime(std::string str)
{
    std::stringstream ss;
    ss << str;
    struct tm mytime;
    ss >> std::get_time(&mytime, "%Y-%m-%d %H:%M:%S");
    return (time_t)mktime(&mytime);
}

//时间戳->时间字符串
std::string myTimeToStr(time64 timer)
{
    struct tm* pt = localTime64(&timer);
    char stTime[20] = { 0 };
    snprintf(stTime, sizeof(stTime), "%d-%02d-%02d %02d:%02d:%02d", pt->tm_year,
        pt->tm_mon, pt->tm_mday, pt->tm_hour, pt->tm_min, pt->tm_sec);
    return stTime;
}

//时间字符串->时间戳
time64 myStrToTime(std::string str)
{
    struct tm mytm;
    sscanf(str.c_str(), "%d-%d-%d %d:%d:%d", &mytm.tm_year, &mytm.tm_mon, &mytm.tm_mday,
        &mytm.tm_hour, &mytm.tm_min, &mytm.tm_sec);
    mytm.tm_isdst = 0;
    return mkTime64(&mytm);
}

int main(int argc, char** argv)
{
    std::cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << std::endl;
    std::string timerstr = "2180-10-10 12:12:12";
    auto timestamp = StrToTime(timerstr);
    auto timestr = TimeToStr(timestamp);
    std::cout << "timestr      = " << timerstr << std::endl;
    //系统方法
    std::cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << std::endl;
    std::cout << "StrToTime    = " << timestamp << std::endl;
    std::cout << "TimeToStr    = " << timestr << std::endl;
    std::cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << std::endl;
    //自己实现方法
    auto mytimestamp = myStrToTime(timerstr);
    auto mytimestr = myTimeToStr(mytimestamp);
    std::cout << "myStrToTime  = " << mytimestamp << std::endl;
    std::cout << "myTimeToStr  = " << mytimestr << std::endl;
    std::cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << std::endl;
    scanf("\n");
    return 0;
}

g++ time.cpp -std=c++20  -o cpp.exe

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1285264.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java 并发编程面试题——Java 线程间通信方式

目录 1.✨Java 线程间有哪些通信方式&#xff1f;1.1.volatile 和 synchronized 关键字1.2.等待/通知机制1.2.1.概述1.2.2.经典范式 1.3.管道输入/输出流1.4.信号量 2.Thread.join() 有什么作用&#xff1f;它的使用场景是什么&#xff1f;3.Java 中需要主线程等待子线程执行完…

家用打印机品牌多,种类杂,那么如何挑选最适合的家用打印机

在购买最好的家用打印机时&#xff0c;你可能会寻找足够多功能的打印机来满足每个人的需求。你的家人可能需要复印文件签字&#xff0c;扫描精致的旧照片&#xff0c;或者在接到通知后立即打印长篇文章或报告。良好的扫描功能确保你可以快速高效地将工作数字化&#xff0c;而每…

工程化使用React

安装 首先全局安装 npm install create-react-app -g创建项目 create-react-app proName最基本的一个react工程化创建完成 项目目录

CRM:如何通过客户数据分析获得业务洞察?

客户数据分析&#xff0c;也称客户分析&#xff0c;是收集、组织和分析客户数据&#xff0c;以深入了解客户行为的过程。企业将利用这些数据来制定与营销、产品开发、销售等相关的业务决策。 通过客户分析&#xff0c;你可以做出简单的业务决策&#xff0c;比如找出投资回报率…

基于PaddleSeg开发的人像抠图web api接口

前言 基于PaddleSeg开发的人像抠图web api接口&#xff0c;提取官方代码&#xff0c;适配各种系统&#xff0c;通过api的接口进行访问。 环境要求 1、Python3.7以上 2、源码&#xff08;文章最后下载&#xff09; 源码结构 测试module.py中添加如下代码&#xff1a; if __na…

城市内涝监测如何防治

洪涝灾害是我国历史上主要自然灾害之一&#xff0c;由于我国大部分地区受季风气候影响和降水季节性分配和空间分布不平衡等因素&#xff0c;一些城市洪涝灾害易发多发&#xff0c;危及城市居民的生命财产安全&#xff0c;也影响城市安全运行和可持续发展。因此&#xff0c;城市…

SQL Sever 基础知识 - 数据筛选(1)

SQL Sever 基础知识 - 四、数据筛选 四、筛选数据第1节 DISTINCT - 去除重复值1.1 SELECT DISTINCT 子句简介1.2 SELECT DISTINCT 示例1.2.1 DISTINCT 一列示例1.2.2 DISTINCT 多列示例 1.2.3 DISTINCT 具有 null 值示例1.2.4 DISTINCT 与 GROUP BY 对比 第2节 WHERE - 过滤查询…

easyexcel的@NumberFormat源码解析

debug了一天&#xff0c;关键源码如下&#xff1a; com.alibaba.excel.write.executor.AbstractExcelWriteExecutor#converterAndSet 由于 NumberFormat 注解对应的字段肯定是 BigDecimal &#xff0c;所以肯定会走这一步 然后进行赋值&#xff0c;然后再之前给cell设置好了格…

linux部署前端页面(实战)

Linux基本命令&#xff08;学习笔记&#xff09;零基础入门linux系统运维_linux find exec rm_Z_Xshan的博客-CSDN博客 如果linux不熟可以看我之前写的入门教程 感谢支持&#xff01;&#xff01; 一、服务器 这里去购买云服务器&#xff0c;如果是练习可以用虚拟机&#xff…

Sequential Modeling Enables Scalable Learning for Large Vision Models

目录 一、论文速读 1.1 摘要 1.2 论文概要总结 二、论文精度 2.1 论文试图解决什么问题&#xff1f; 2.2 论文中提到的解决方案之关键是什么&#xff1f; 2.3 论文提出的架构和损失函数是什么&#xff1f; 2.4 用于定量评估的数据集是什么&#xff1f;代码有没有开源&a…

【设计模式】单例模式代码设计

目录 单例模式简介饿汉单例模式懒汉单例模式线程安全的懒汉单例模式 橙色 详细可参考该篇文章&#xff1a;C设计模式 - 单例模式 单例模式简介 单例模式指的是&#xff0c;无论怎么获取&#xff0c;永远只能得到该类类型的唯一一个实例对象&#xff0c;那么设计一个单例就必须…

麒麟inux无法打印pdf文档的Bug解决

笔者手里有一批国产linu系统&#xff0c;目前开始用在日常的工作生产环境中&#xff0c;我这个老程序猿勉为其难的充当运维的或网管的角色。 国产linu系统常见的为麒麟Linux&#xff0c;统信UOS等&#xff0c;基本都是基于debian再开发的linux。 bug描述&#xff1a; 打印机…

泛域名SSL证书

泛域名证书&#xff0c;也被称为通配符证书&#xff0c;是一种可以保护一个域名及其所有子域名的SSL/TLS证书。它使用星号&#xff08;*&#xff09;作为通配符来表示任意字符&#xff0c;因此只需一个证书就可以为多个子域提供加密服务。例如&#xff0c;如果你拥有一个名为“…

使用VBA创建Excel条件格式

实例需求&#xff1a;数据总行数不确定&#xff0c;现需要将Category区域&#xff08;即C列到J列&#xff09;中第3行开始的区域设置条件格式&#xff0c;规则如下&#xff1a; 只对部分指定单元格应用色阶条件格式&#xff08;3色&#xff09;指定单元格应满足条件&#xff1…

如何使用cpolar内网穿透工具实现公网SSH远程访问Deepin

文章目录 前言1. 开启SSH服务2. Deppin安装Cpolar3. 配置ssh公网地址4. 公网远程SSH连接5. 固定连接SSH公网地址6. SSH固定地址连接测试 前言 Deepin操作系统是一个基于Debian的Linux操作系统&#xff0c;专注于使用者对日常办公、学习、生活和娱乐的操作体验的极致&#xff0…

一文讲透Python机器学习决策树算法的基本概念与原理

1.决策树算法的基本特点与优势 决策树算法是一种有监督、非参数、简单、高效的机器学习算法。相对于非监督式学习方法&#xff0c;决策树算法由于充分利用了响应变量的信息&#xff0c;因此能够很好地克服噪声问题&#xff0c;在分类及预测方面效果更佳。决策树的决策边界为矩…

win10打开或关闭系统图标界面网络显示灰色

1、右击任务栏&#xff0c;选择任务管理器&#xff0c;或同时按下键盘上的“CtrlShiftEsc”组合键打开任务管理器&#xff1b; 2、在任务管理器【进程】选卡下找到【资源管理器】&#xff0c;单击右键&#xff0c;选择【重新启动】即可。 等待桌面和任务栏全部消失&#xff0c…

某60区块链安全之JOP实战一学习记录

区块链安全 文章目录 区块链安全Jump Oriented Programming实战一实验目的实验环境实验工具实验原理实验内容Jump Oriented Programming实战一 实验步骤分析合约源代码漏洞Jump Oriented Programming实战一 实验目的 学会使用python3的web3模块 学会分析以太坊智能合约中中Ju…

《数据库系统概论》学习笔记——王珊 萨师煊

第一章 绪论 一、数据库系统概述 1.数据库的4个基本概念 &#xff08;1&#xff09;数据 描述事物的符号记录称为数据 &#xff08;2&#xff09;数据库 存放数据的仓库 &#xff08;3&#xff09;数据库管理系统 主要功能&#xff1a; &#xff08;1&#xff09;数据定…

RabbitMQ的消息发送和接收机制

所有 MQ 产品从模型抽象上来说都是一样的过程&#xff1a; 消费者&#xff08;consumer&#xff09;订阅某个队列。生产者&#xff08;producer&#xff09;创建消息&#xff0c;然后发布到队列&#xff08;queue&#xff09;中&#xff0c;最后将消息发送到监听的消费者。 上…