32位旧内核2038溢出time记录

2023-12-05 10:44

本文主要是介绍32位旧内核2038溢出time记录,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        项目中有使用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;elseleap = 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

这篇关于32位旧内核2038溢出time记录的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

如何解决idea的Module:‘:app‘platform‘android-32‘not found.问题

《如何解决idea的Module:‘:app‘platform‘android-32‘notfound.问题》:本文主要介绍如何解决idea的Module:‘:app‘platform‘andr... 目录idea的Module:‘:app‘pwww.chinasem.cnlatform‘android-32

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

《MySQL中查询VARCHAR类型JSON数据的问题记录》在数据库设计中,有时我们会将JSON数据存储在VARCHAR或TEXT类型字段中,本文将详细介绍如何在MySQL中有效查询存储为V... 目录一、问题背景二、mysql jsON 函数2.1 常用 JSON 函数三、查询示例3.1 基本查询3.2

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

MySQL INSERT语句实现当记录不存在时插入的几种方法

《MySQLINSERT语句实现当记录不存在时插入的几种方法》MySQL的INSERT语句是用于向数据库表中插入新记录的关键命令,下面:本文主要介绍MySQLINSERT语句实现当记录不存在时... 目录使用 INSERT IGNORE使用 ON DUPLICATE KEY UPDATE使用 REPLACE

新特性抢先看! Ubuntu 25.04 Beta 发布:Linux 6.14 内核

《新特性抢先看!Ubuntu25.04Beta发布:Linux6.14内核》Canonical公司近日发布了Ubuntu25.04Beta版,这一版本被赋予了一个活泼的代号——“Plu... Canonical 昨日(3 月 27 日)放出了 Beta 版 Ubuntu 25.04 系统镜像,代号“Pluc

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

Spring Boot中定时任务Cron表达式的终极指南最佳实践记录

《SpringBoot中定时任务Cron表达式的终极指南最佳实践记录》本文详细介绍了SpringBoot中定时任务的实现方法,特别是Cron表达式的使用技巧和高级用法,从基础语法到复杂场景,从快速启... 目录一、Cron表达式基础1.1 Cron表达式结构1.2 核心语法规则二、Spring Boot中定