日期与时间戳-如何将时间戳转换成日期

C语言代码把时间戳字符串转换成日期时间格式以及修正bug的测试方法 时间戳是一种用来表示日期和时间的数字格式,在不同的编程语言里时间戳的长度和单位都不一样:C:以秒为单位,目前的时间戳是10位数。Python:以秒为单位并且有精确到7位小数的毫秒,目前的时间戳整数部分是10位数,毫秒是7位小数。JavaScript:以毫秒为单位,目前的时间戳是13位数。虽然时间戳在计算机内部处理时间非常方便,但对于人类来说显得不直观。在日常编程工作中经常遇到需要将时间戳转换为日期时间格式方便,有以下好处:1. 可读性:将时间戳转换为日期时间格式后,时间数据变得更容易理解。 阅读详情
AI摘要

本文探讨了时间戳的概念,它是计算机时间表示方式,以及与日期和时区的关系。重点介绍了如何将时间戳转换为日期,包括Python和C#中的方法,以及在嵌入式开发中可能遇到的挑战。还详细阐述了闰年规则在时间计算中的应用,并给出了C语言的实现示例。

        日期和时间戳都是对时间的编码,日期站在人角度对时间的编码,而时间戳是站在计算机的角度对时间的编码。虽然每天都感受到时间的存在,若你若问什么是时间?这个问题比较哲学很难回给出简洁的定义,但有一种观点认为“时间本不存在,时间就是运动”。

1. 什么是时间戳

        时间戳一般指unix时间戳,是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数(UTC时间),尽管时间戳在全球范围内应该是一致的,但由于不同地区采用了不同的时区,同一时刻在不同地方的电脑显示的日期和时间可能会有所不同。

2. 什么是时区

        时区的概念是为了让不同地区的人们在相同的时刻看到相同的天文事件,比如日出和日落。因此,全球被划分成了24个时区,每个时区都与地球上的经线相对应,使得当地的时间与太阳的位置相对应。这导致了在同一时刻,位于不同时区的计算机所显示的时间会有所不同。在北京的电脑显示的时间可能是早晨8点,而在纽约的电脑显示的时间可能是晚上8点,即使它们在同一时刻都是根据相同的Unix时间戳计算出来的。这是因为北京采用东八区时区,而纽约采用东部标准时间(EST)时区,它们之间相差了12个小时。

        在中国内部时区有些特殊,即使你没有到新疆和黑龙江,你应该也听过"新疆晚上10点了天还没黑,黑龙江下午4点天就开始黑了",在中国从新疆的最东边到黑龙江最西边跨越了约62度,按15度每个时区,这里至少跨越5个时区,但实际上中国仅采用了一个时区-东八区。另外现在我们谈到的“北京时间”,并不是真正意义上的北京时间,而是以陕西省渭南市蒲城县授时中心发出的时间为“北京时间”。

3. 如何将时间戳转换成日期

        在一些高级开发语言都提供了相应的接口,如在python中直接使用time.localtime()可完成时间戳到日期的转换、在c#中使用TimeZone.CurrentTimeZone.ToLocalTim可以将时间戳转换成日期,但在嵌入式开发中特别是MCU开发,每个芯片原厂可能使用不同的编译器,而这个编译器对C运行库实现并不完整导致了对某些时间戳(如闰年)向日期转换过程中可能存在一定的错误,当理清楚这个转换关系后我们也能编写我们自己的转换函数。

        第一个我们需要能清楚的是时区关系,转换前需要加上时区偏移,如下所示:

时间戳与时区

        在日期中,每天都有24个小时,每个小时都有60分钟,每分钟都有60秒这是完全固定的,并不存在那一天少了1个小时那一天多了1个小时,通过时间戳计算时分秒这部分相对来说较为容易;而年月日这部分计算相关规定来较为复杂,这是由于每个月天数不一样,而且在闰年中与非闰年年单色天数可能也不一样。 

闰年规则的韦恩图表示

        对于时分秒计算类似,仅仅使用取余+整除可计算时分秒;而对于年月日由于闰年存在不能通过一个简单的公式计算等到,而需要使用当前时间戳从1970年进行递推并,递推中需要对闰年进行补偿。 

4. C实现逻辑

        时间戳转日期实现原型,与C库的localtime功能相同:

#include <stdint.h>
#include <stdio.h>

struct DateTime {
    int year;   // 年
    int month;  // 月
    int day;    // 日
    int hour;   // 时
    int min;    // 分
    int sec;    // 秒
};

void timestampToDateTime(uint32_t timestamp, struct DateTime *dt, int timezoneOffset) 
{
    uint32_t totalSeconds = timestamp + timezoneOffset * 3600;

    // 计算年份
    dt->year = 1970;
    while (totalSeconds >= (31536000UL + ((dt->year % 4 == 0 && (dt->year % 100 != 0 || dt->year % 400 == 0)) ? 86400 : 0))) 
    {
        totalSeconds -= 31536000UL + ((dt->year % 4 == 0 && (dt->year % 100 != 0 || dt->year % 400 == 0)) ? 86400 : 0);
        dt->year++;
    }

    // 计算月份和日期
    uint8_t daysInMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    if ((dt->year % 4 == 0 && (dt->year % 100 != 0 || dt->year % 400 == 0))) 
    {
        daysInMonth[1] = 29;  // 闰年2月有29天
    }
    dt->month = 0;
    while (totalSeconds >= (daysInMonth[dt->month] * 86400UL)) 
    {
        totalSeconds -= daysInMonth[dt->month] * 86400UL;
        dt->month++;
    }
    dt->day = totalSeconds / 86400UL + 1;

    // 计算时分秒
    dt->hour = (totalSeconds % 86400) / 3600;
    dt->min = (totalSeconds % 3600) / 60;
    dt->sec = totalSeconds % 60;
}

int main() 
{
    uint32_t timestamp = 1711324800; //(0时区) 2021-03-25 00:00:00 的时间戳
    int timezoneOffset = 8; // 北京时间的偏移量(小时)
    struct DateTime dt;

    timestampToDateTime(timestamp, &dt, timezoneOffset);

    // 输出日期时间信息
    printf("Date & Time: %d-%02d-%02d %02d:%02d:%02d\n",
           dt.year, dt.month + 1, dt.day, dt.hour, dt.min, dt.sec);

    return 0;
}

        时间装时间戳转实现原型,与C库的localtime功能相同:

#include <stdio.h>
#include <stdint.h>

struct DateTime {
    int year;
    uint8_t month;
    uint8_t day;
    uint8_t hour;
    uint8_t min;
    uint8_t sec;
};

uint32_t dateTimeToTimestamp(struct DateTime dt, int timezoneOffset) 
{
    // 计算总秒数
    uint32_t totalSeconds = 0;

    // 计算年份对应的秒数
    for (int year = 1970; year < dt.year; ++year) {
        totalSeconds += ((year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) ? 31622400UL : 31536000UL);
    }

    // 计算月份对应的秒数
    uint8_t daysInMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    if (dt.year % 4 == 0 && (dt.year % 100 != 0 || dt.year % 400 == 0)) {
        daysInMonth[1] = 29;  // 闰年2月有29天
    }
    for (int month = 0; month < dt.month - 1; ++month) {
        totalSeconds += daysInMonth[month] * 86400UL;
    }

    // 加上日期对应的秒数
    totalSeconds += (dt.day - 1) * 86400UL;

    // 加上时间对应的秒数
    totalSeconds += dt.hour * 3600 + dt.min * 60 + dt.sec;

    // 考虑时区偏移量
    totalSeconds -= timezoneOffset * 3600;

    return totalSeconds;
}

int main() 
{
    struct DateTime dateTime = {2024, 3, 25, 8, 0, 0}; // 日期时间示例
    int timezoneOffset = 8; // 北京时间的偏移量(小时)

    // 将日期时间转换为时间戳并输出
    uint32_t timestamp = dateTimeToTimestamp(dateTime, timezoneOffset);
    printf("Converted Timestamp: %u\n", timestamp);

    return 0;
}

活动倒计时效果 倒计时效果 需求:计算到下课还有多少时间 案例 分析: ①:用将来时间减去现在时间就是剩余的时间 ②:核心: 使用将来的时间戳减去现在的时间戳 ③:把剩余的时间转换为 天 时 分 秒 注意: 通过时间戳得到是毫秒,需要转换为秒在计算 转换公式:  d = parseInt(总秒数/ 60/60 /24); // 计算天数  h = parseInt(总秒数/ 60/60 %24) // 计算小时  m = parseInt(总秒数 /60 %60 ); // 计算分数  s = parseInt( 阅读详情

相关推荐

实现时间戳和日期的转换-js(超简单)

一秒实现时间戳的双向转换

专业解决各种上架过包问题,专业团队专业处理 2220

将时间戳转换为日期格式:moment、new Date()

将时间戳转换为日期格式:moment、new Date()

YY的博客 2万+

机器人视觉伺服控制入门:从IBVS到PBVS的实战指南(附Python代码示例)

本文深入解析机器人视觉伺服控制,对比了基于图像的视觉伺服和基于位置的视觉伺服两大核心方法。通过实战案例与Python代码示例,详细阐述了从误差计算、交互矩阵到速度控制的全流程,帮助读者掌握如何利用视觉反馈实现机器人的实时闭环控制,提升其在动态环境中的作业能力。

weixin_29061997的博客 259

时间戳转成日期格式(全)

代码: parseInt(new Date().getTime()) 转化为明天现在的时间戳: parseInt(new Date().getTime() + 3600 * 1000 * 24)

小柠檬爱编程 3万+

uniapp+ucharts折线图toolTip不显示?别慌,手把手教你用showToolTip方法精准修复

本文详细解析了uniapp+ucharts折线图中toolTip不显示的常见问题,提供了showToolTip方法的精准修复方案。从底层原理到实战代码,帮助开发者解决触摸事件冲突、坐标计算偏差等问题,确保折线图交互提示功能稳定运行。

weixin_30316097的博客 402

Qt6安装保姆级教程:从国内镜像下载到配置避坑指南(附清华/中科大源)

本文提供详细的Qt6安装与配置指南,重点介绍如何利用清华大学、中国科学技术大学等国内镜像源解决下载速度慢的问题。内容涵盖在线安装器获取、组件选择策略、环境变量配置以及常见编译与部署问题的排查方法,旨在帮助国内开发者高效、顺畅地完成Qt6开发环境搭建。

weixin_29281915的博客 633

js 中日期 转换成时间戳 例如2013-08-30 转换为时间戳

js 中日期 转换成时间戳 例如2013-08-30 转换为时间戳 热心网友 2018-11-18 js字符串转化时间戳可以使用自带函数 Date(要转化的时间字符串)先转化为Date类型,之后再将Date类型转化为时间戳类型,其中时间字符串有要求,形式必须是 yyyy-MM-dd HH:mm:ss 的形式,当然,也可以只是 yyyy-MM-dd, 就是 2013-08-30,如下: ...

weixin_42246997的博客 5077

不用写代码!用AIStarter 5.0.0离线包部署InfiniteTalk的完整指南(Windows/Mac/Linux全平台)

本文详细介绍了如何使用AIStarter 5.0.0离线包在Windows、Mac和Linux平台上零代码部署InfiniteTalk数字人。从环境准备、离线资源获取与验证,到全平台部署实操指南,提供了完整的本地化安装流程和优化建议,帮助用户快速实现AI项目的一键部署。

weixin_30275415的博客 273

SAP时间戳转换成日期

【代码】SAP时间戳转换成日期。

baidu_37039459的博客 842

QGIS效率提升神器:qgis_mcp插件+VSCode联合工作流配置全解析

本文详细解析了如何通过配置qgis_mcp插件与VSCode的联合工作流,实现语音控制和代码自动化来大幅提升QGIS操作效率。该方案将自然语言交互与现代编辑器生态结合,为地理信息专业人士构建了智能、高效的全新工作模式,彻底改变传统GIS操作方式。

weixin_29228203的博客 189

YOLOv12涨点改进 | 全网独家首发Conv改进篇 | Arxiv 2025 | 引入一种新的WConv加权卷积改进YOLOv12,显著提升其特征提取能力和目标检测精度

本文提出了一种新型加权卷积(WConv)模块,通过引入最优密度函数动态调整邻域像素权重,显著提升了YOLOv12目标检测性能。WConv在保持参数数量不变的情况下,提高了模型精度(VGG准确率提升10%)、增强了小目标检测能力,并改善了多尺度特征提取。文中详细介绍了模块原理、网络结构改进方法,并提供了核心代码实现和yaml配置文件。实验表明,该方法在图像任务中最高可降低53%的损失,虽然会带来11%的时间开销,但具有优异的鲁棒性。该技术可广泛应用于2D/3D图像处理领域。

Ai缝合怪、助力小伙伴高效发论文 215

java 日期格式转换成时间戳_日期字符串和时间戳相互转换Java代码

最近在做毕业设计的时候,遇到一个需求,拿到一些时间格式,类似于"2012-12-01 12:02:00" 这样的时间格式,然后让程序以这些时间为起点,生成类似于"2012-12-01 12:02:01","2012-12-01 12:02:02","2012-12-01 12:02:03"。。。。。后面一个时间是前面一个时间累加1s的结果。思路:需要把"2012-12-01 12:02:00" 这...

weixin_33309067的博客 1008

AUTOSAR内存篇 -内存驱动(Mem)

Mem驱动程序的task是基于底层内存设备技术的物理分段的低级内存访问。Mem驱动程序的API与内存设备技术无关,因此向存储器访问模块上层提供了与存储器设备无关的接口。所有高级功能(如跨段操作)都由内存访问模块处理,以尽可能降低Mem驱动器的复杂性和占用空间。Mem驱动API命名、类型定义和文件命名规则都遵循标准的AUTUSAR BSW模块实现。服务Mem_Init初始化Mem驱动的内部状态,并设置Mem驱动Job处理状态到MEM_JOB_OK。

IOT2017的博客 712

java将当前时间戳转换成指定日期时间和时区

作为一名经验丰富的开发者,我很高兴能帮助你学习如何使用Java将当前时间戳转换为指定的日期和时区。以下是整个流程的详细说明,包括步骤、代码示例和解释。 流程图 以下是整个流程的流程图: #render_9_2383757399-svg{font-family:"trebuchet ms",verdana,arial,san...

weixin_31301881的博客 3079

Unity之如何接入NPOI 快速读取Excel

NPOI是指构建在POI 3.x版本之上的一个程序,NPOI可以在没有安装Office的情况下对Word或Excel文档进行读写操作。 NPOI是一个开源的C#读写Excel、WORD等微软OLE2组件文档的项目

TxNet 4395

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

如何用js将日期转换成时间戳

一、日期转换成时间戳     js字符串转化成时间戳可以使用自带函数Date(要转化的时间字符串)先转化为Date类型,之后再将Date类型转化为时间戳类型,其中时间字符串有要求,形式必须是yyyy-MM-dd HH:mm:ss的形式,当然,也可以只是yyyy-MM-dd,就是2021-11-22,如下: var date = new Date('2021-11-22');     此处,会得到一个Date类型的数据,获得时间

qq_26780317的博客 11万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

js 中日期转换成时间戳

js字符串转化时间戳可以使用自带函数 Date(要转化的时间字符串)先转化为Date类型,之后再将Date类型转化为时间戳类型,其中时间字符串有要求,形式必须是 yyyy-MM-dd HH:mm:ss 的形式,当然,也可以只是 yyyy-MM-dd, 就是 2013-08-30,如下: 此处会得到一个 Date 类型的数据,获得时间戳数据,需要对日期对象进行操作,将日期转化为时间戳有三种方式...

weixin_30564785的博客 5557

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

时间戳转换成日期

在php中我想要获取时间戳有多种方法,最常用的就是使用time函数与strtotime()函数把日期转换成时间戳了,下面我来给大家分享一下时间戳函数 strtotime用法。获取指定的年月日转化为时间戳:pHP时间戳函数获取指定日期的unix时间戳 strtotime('2012-12-7')示例如下:代码如下:&lt;?php     echo strtotime('2012-12-7'); /...

清晨的一缕阳光 838

js 将日期转换成时间戳

js 将日期转换成时间戳

qq_33235680的博客 9515

PHP如何把时间戳转换成日期格式?使用场景是什么?底层原理是什么?

通过 PHP 的date()函数或DateTime类,你可以轻松地将时间戳转换成各种格式的日期字符串。

长风破浪会有时的博客 1084

js将时间戳转换成日期格式

//简单的一句代码 vardate=newDate(时间戳);//获取一个时间对象注意:如果是uinx时间戳记得乘于1000。比如php函数time()获得的时间戳就要乘于1000 /*----------下面是获取时间日期的方法,需要什么样的格式自己拼接起来就好了----------*/ date.getFullYear();//获取完整的年份(4位,19...

weixin_33721344的博客 304

LINUX时间戳转换成日期

//Convert Unix timestamp to normal date style public String TimeStamp2Date(String timestampString){ Long timestamp = Long.parseLong(timestampString)*1000; String date = new java.text.S...

流浪的代码 466

时间转换,把指定日期格式转换成时间戳

此函数有两个参数,第一个参数是字符串类型的日期,第二个参数是这个日期的格式 此函数返回一个时间戳 import time, datetime def TimeConvert(timeStr, type): timeArray = time.strptime(timeStr, type) return int(time.mktime(timeArray)) TimeConvert("2013-10-10 23:40:00", "%Y-%m-%d %H:%M:%S") ...

weixin_42279212的博客 1515

将时间戳转换成日期格式:

1. 将时间戳转换成日期格式: function timestampToTime(timestamp) { var date = new Date(timestamp * 1000);//时间戳为10位需*1000,时间戳为13位的话不需乘1000 Y = date.getFullYear() + '-'; M = (date.getMonth()+1 < 10 ? '0'+(date.getMonth()+1) : date.getMonth(...

weixin_53935634的博客 2万+

wps时间戳转换成日期

第一步 打开WPS表格,选择空表格 第二步 右击选择“设置单元格格式” 第三步 选择“日期”,然后选择需要的日期类型 第四步 然后在表格里,输入公式 =(D2/1000+8*3600)/86400+70*365+19,这里的 D2 为时间戳表格位置 我这里的时间戳单位是秒,所以就不需要除1000了,=(D2+8*3600)/86400+70*365+19 如果是其他时区,需要将 8*3600 改...

牛奔的博客 4255

vue前端-时间戳转换成日期格式/日期转换成时间戳

一、日期转换成时间戳 new Date().getTime() //当前时间 变成时间戳 new Date(res.data.beginTime).getTime() //获取到的时间转化成时间格式,再变成时间戳 二、时间戳转换成日期格式 1、安装 npm install moment --save 2、main.js注入 import moment from 'moment' Vue.filter('dateFormat',(value,pattern = 'YYYY-MM-DD HH:mm:s

buukyjmvni的博客 5053
上一篇: VSCode+gcc搭建STM32开发环境的几种方案
下一篇: 使用生产者消费者模型重写你的串口处理程序
老Z先生
博客等级 码龄4年 417粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值