C语言 日期转时间戳
C语言 日期转时间戳
- 废话先说
- 啥时候开始数?
- 站在2022的肩膀上!
- 一年能“嘀嗒”多少下?
- 言归正传
废话先说
关于用C实现日期转时间戳,面对这样一个很基础的功能,作为一个小白白当然是,先百度,再看CSDN,最后再去知乎逛,看看有没有现成的代码,就拿过来跑一跑,能省很多事,,,,,
本着省事的目的,就找呀,复制过来,测试,找了半天,没有一个能用的,得不偿失了,很烦。。。
那就自己动手吧!
啥时候开始数?
说到时间戳,好像一般默认讲的都是UNIX时间戳,
百度和维基讲的都是,从1970年1月1日(UTC/GMT的午夜) 零点零分零秒 开始数秒!
关于有哥们问,为啥1970-01-01 08:00:00 转出来的 时间戳 是 0 呀 ?
UTC时间和北京时间 都去了解一下吧!
站在2022的肩膀上!
从1970-01-01 起开始数秒 感觉太遥远了
不妨从 2022-01-01 00:00:00 进行新的开始吧。
//定义一个起始时间戳 2022-01-01 00:00:00
#define SPECIALTIMESTAMP 1640966400
过去的已经过去了,从今年开始数,数完了再加上 2022-01-01 00:00:00 这一刻的时间戳,不也就行了嘛
一年能“嘀嗒”多少下?
为此,定义了一些宏
平年一年365天,闰年一年366天!
#define SECONDS_IN_A_MINUTE 60
#define SECONDS_IN_AN_HOUR 60 * SECONDS_IN_A_MINUTE
#define SECONDS_IN_A_DAY 24 * SECONDS_IN_AN_HOUR#define SECONDS_IN_A_COMMON_YEAR 365 * SECONDS_IN_A_DAY
#define SECONDS_IN_A_LEAP_YEAR 366 * SECONDS_IN_A_DAY
百度平年的时候,搜到了一个很难受的结果。。
再看看维基,又来了个公历。。。。
作为一个只关注礼拜天和节假日的小菜鸟,我吐了,#ucking#
简单说一下,
公历是阳历的一种,阳历还包括公历外的其他历法;
农历则是以阳历为主,以阴历为辅的一种方法,严格来讲叫阴阳历;
阳历,太阳历,是以地球围绕太阳公转一周的时间为一年而定的历法,就是阳历;
阴历,太阴历,是根据月球绕地球运行的周期而定的历法;
好吧,再简单一下:看图
言归正传
时间也不早了,日期转时间戳,没啥可说的,就是数数,直接上代码,
#include <stdio.h>typedef struct times
{int Year;int Mon;int Day;int Hour;int Min;int Second;
}Times;#define SECONDS_IN_A_MINUTE 60
#define SECONDS_IN_AN_HOUR 60 * SECONDS_IN_A_MINUTE
#define SECONDS_IN_A_DAY 24 * SECONDS_IN_AN_HOUR#define SECONDS_IN_A_COMMON_YEAR 365 * SECONDS_IN_A_DAY
#define SECONDS_IN_A_LEAP_YEAR 366 * SECONDS_IN_A_DAY//从1970-01-01 08:00:00 起开始数秒
//定义一个起始时间戳 2022-01-01 00:00:00
#define SPECIALTIMESTAMP 1640966400
typedef struct
{int Year;int Mon;int Day;int Hour;int Min;int Second;
}Date;Date specialTime = {2022,01,01,00,00,00
};
//31 : 1 3 5 7 8 10 12 ; 30 : 4 6 9 11
const int daysofmon[] ={0,31 * SECONDS_IN_A_DAY,(28 + 31) * SECONDS_IN_A_DAY,(31 + 28 + 31) * SECONDS_IN_A_DAY,(30 + 31 + 28 + 31 ) * SECONDS_IN_A_DAY,(31 + 30 + 31 + 28 + 31) * SECONDS_IN_A_DAY,(30 + 31 + 30 + 31 + 28 + 31) * SECONDS_IN_A_DAY,(31 + 30 + 31 + 30 + 31 + 28 + 31) * SECONDS_IN_A_DAY,(31 + 31 + 30 + 31 + 30 + 31 + 28 + 31) * SECONDS_IN_A_DAY,(30 + 31 + 31 + 30 + 31 + 30 + 31 + 28 + 31) * SECONDS_IN_A_DAY,(31 + 30 + 31 + 31 + 30 + 31 + 30 + 31 + 28 + 31) * SECONDS_IN_A_DAY,(30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31 + 28 + 31) * SECONDS_IN_A_DAY};
const int _daysofmon[] ={0,31 * SECONDS_IN_A_DAY,(29 + 31) * SECONDS_IN_A_DAY,(31 + 29 + 31) * SECONDS_IN_A_DAY,(30 + 31 + 29 + 31 ) * SECONDS_IN_A_DAY,(31 + 30 + 31 + 29 + 31) * SECONDS_IN_A_DAY,(30 + 31 + 30 + 31 + 29 + 31) * SECONDS_IN_A_DAY,(31 + 30 + 31 + 30 + 31 + 29 + 31) * SECONDS_IN_A_DAY,(31 + 31 + 30 + 31 + 30 + 31 + 29 + 31) * SECONDS_IN_A_DAY,(30 + 31 + 31 + 30 + 31 + 30 + 31 + 29 + 31) * SECONDS_IN_A_DAY,(31 + 30 + 31 + 31 + 30 + 31 + 30 + 31 + 29 + 31) * SECONDS_IN_A_DAY,(30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31 + 29 + 31) * SECONDS_IN_A_DAY
};
//日期转时间戳
size_t Date2timeStamp(Date standardTime){//需要计算 传进来的 standardTime 比 specialTime 大多少秒size_t differenceValue = 0; //定义这个差值,单位为秒int leapYears = 0;if((standardTime.Year < specialTime.Year) || (standardTime.Year > 2099))//不允许 specialTime.Year 之前的时间传进来{printf("The year %d is not supported\r\n",standardTime.Year);return -1;}if((standardTime.Mon < 1) || (standardTime.Mon > 12))//不允许 无效的mon 传入{printf("The month %.2d is out of line\r\n",standardTime.Mon);return -1;}if((standardTime.Day < 1) || (standardTime.Day > 31))//不允许 无效的day 传入{printf("The day %.2d is out of line\r\n",standardTime.Day);return -1;}if((standardTime.Hour < 0) || (standardTime.Hour > 24))//不允许 无效的hour 传入{printf("The hour %.2d is out of line\r\n",standardTime.Hour);return -1;}if((standardTime.Min < 0) || (standardTime.Min > 59))//不允许 无效的min 传入{printf("The min %.2d is out of line\r\n",standardTime.Min);return -1;}if((standardTime.Second < 0) || (standardTime.Second > 59))//不允许 无效的sec 传入{printf("The sec %.2d is out of line\r\n",standardTime.Second);return -1;}//从 specialTime 开始,到 standardTime 的前一年之间有过少个闰年for(int i = specialTime.Year; i < standardTime.Year; i++){if((i % 4 == 0 && i % 100 != 0) || (i % 400 == 0)){leapYears++;}}differenceValue += (SECONDS_IN_A_LEAP_YEAR * leapYears +SECONDS_IN_A_COMMON_YEAR * (standardTime.Year - specialTime.Year - leapYears));//判断 是不是闰年if((standardTime.Year % 4 == 0 && standardTime.Year % 100 != 0) || (standardTime.Year % 400 == 0)) {differenceValue += (_daysofmon[standardTime.Mon - 1] +(standardTime.Day - 1) * SECONDS_IN_A_DAY +(standardTime.Hour ) * SECONDS_IN_AN_HOUR +(standardTime.Min ) * SECONDS_IN_A_MINUTE +standardTime.Second);}else{differenceValue += (daysofmon[standardTime.Mon - 1] +(standardTime.Day - 1) * SECONDS_IN_A_DAY +(standardTime.Hour) * SECONDS_IN_AN_HOUR +(standardTime.Min) * SECONDS_IN_A_MINUTE +standardTime.Second);}return differenceValue += SPECIALTIMESTAMP;
}int main(){//2022-09-16 22:47:24 1663339644Date Time = {2022,9, //不要填09和08,会判定成8进制17,0,8,8};printf("%lld\r\n",Date2timeStamp(Time));return 0;
}
简单测试过了,应该能用个几十年的。
C语言 日期转时间戳相关推荐
- java8日期转时间戳_Java 8日期和时间
java8日期转时间戳 如今,一些应用程序仍在使用java.util.Date和java.util.Calendar API,包括使我们的生活更轻松地使用这些类型的库,例如JodaTime. 但是,J ...
- Spark SQL 日期和时间戳函数
Spark SQL 日期和时间戳函数 Spark SQL 提供了内置的标准 Date 和 Timestamp函数,定义在 DataFrame API 中,所有函数都接受输入日期类型.时间戳类型或字符串 ...
- 时间日期与时间戳转换(Linux C)
本文主要学习三个知识点,第一是UTC时间.GMT时间的概念:第二是在Unix环境下UTC时间与时间戳的转换:第三是在C语言中如何修改时区. 本文参考了<UNP>以及 http://blog ...
- Lua 日期转时间戳
在lua中日期转时间戳需要先进行, 日期字符转table操作,然后才能进行转换,这和大多数语言都是不同的,因此记录一下 function trim(s)return (s:gsub("^%s ...
- C语言实现Unix时间戳和北京时间的相互转换(已编译,亲试可用~)
目录 一.什么是Unix时间戳 二.应用C语言库函数 三.C语言实现Unix时间戳与北京时间的相互转换 一.什么是Unix时间戳 1.Unix时间戳是从1970年1月1日(UTC/GMT的午夜 ...
- mysql 日期和时间戳互换
1.日期转时间戳 UNIX_TIMESTAMP('2019-06-25 12:30:00') 2.时间戳转日期 FROM_UNIXTIME(1545711900,'%Y-%m-%d') 转载于:htt ...
- R语言日期函数weekdays, months, quarters julian实战(星期几、那个月、那个季度、时间差)
R语言日期函数weekdays, months, quarters & julian实战(星期几.那个月.那个季度.时间差) 目录
- plsql programming 10 日期和时间戳
年 月 日 时 分 秒 时区 用小时表示的相对于 UTC 的时差 用分钟表示的相对于 UTC 的时差 date 存储日期和时间, 不带时区, 精确到秒 timestamp 存储日期和时间, 不带时区, ...
- python3 时间、日期、时间戳的转换
1.简介 在编写代码时,往往涉及时间.日期.时间戳的相互转换. 2.示例 # 引入模块 import time, datetime 2.1 str类型的日期转换为时间戳 # 字符类型的时间 tss1 ...
最新文章
- 【转载】关于RabbitMQ的消息确认
- suse LINUX系统中的,用户权限的问题。
- 如何确定h.264的码率
- C++的冒泡排序法的原理是什么?
- (转)解决PowerDesigner 反向工程没有注释(备注)
- 《Redis开发与运维》读书笔记
- ## 2019-8-30 光滑粒子流体力学开源软件(Dual)sphysics使用中遇到的一些问题1
- Excel 计算标准差
- sql分组排序,查询每组第一个数据
- 二进制、八进制、十六进制的写法
- PROE产品设计:20个机械设计知识点
- python从入门到入魔第三天——time库和datetime库基本使用
- leetcode692:前K个高频单词
- 汽车软件大战一触即发,诚迈科技如何重构整车“软架构”
- arduino烧录esp8266出错:error: espcomm_upload_mem failed
- C++版 PPyolo+部署记录
- OTT广告价值「锋芒毕露」,谁能蚕食更大市场?
- 赛扬处理器_海尔逸15笔记本仅2299元,其酷睿10代赛扬处理器是什么情况?
- 体验为王的时代,如何提高售后服务环节的客户参与度?
- 谷神—阴阳和道的通道