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语言 日期转时间戳相关推荐

  1. java8日期转时间戳_Java 8日期和时间

    java8日期转时间戳 如今,一些应用程序仍在使用java.util.Date和java.util.Calendar API,包括使我们的生活更轻松地使用这些类型的库,例如JodaTime. 但是,J ...

  2. Spark SQL 日期和时间戳函数

    Spark SQL 日期和时间戳函数 Spark SQL 提供了内置的标准 Date 和 Timestamp函数,定义在 DataFrame API 中,所有函数都接受输入日期类型.时间戳类型或字符串 ...

  3. 时间日期与时间戳转换(Linux C)

    本文主要学习三个知识点,第一是UTC时间.GMT时间的概念:第二是在Unix环境下UTC时间与时间戳的转换:第三是在C语言中如何修改时区. 本文参考了<UNP>以及 http://blog ...

  4. Lua 日期转时间戳

    在lua中日期转时间戳需要先进行, 日期字符转table操作,然后才能进行转换,这和大多数语言都是不同的,因此记录一下 function trim(s)return (s:gsub("^%s ...

  5. C语言实现Unix时间戳和北京时间的相互转换(已编译,亲试可用~)

    目录 一.什么是Unix时间戳 二.应用C语言库函数 三.C语言实现Unix时间戳与北京时间的相互转换 一.什么是Unix时间戳     1.Unix时间戳是从1970年1月1日(UTC/GMT的午夜 ...

  6. mysql 日期和时间戳互换

    1.日期转时间戳 UNIX_TIMESTAMP('2019-06-25 12:30:00') 2.时间戳转日期 FROM_UNIXTIME(1545711900,'%Y-%m-%d') 转载于:htt ...

  7. R语言日期函数weekdays, months, quarters julian实战(星期几、那个月、那个季度、时间差)

    R语言日期函数weekdays, months, quarters & julian实战(星期几.那个月.那个季度.时间差) 目录

  8. plsql programming 10 日期和时间戳

    年 月 日 时 分 秒 时区 用小时表示的相对于 UTC 的时差 用分钟表示的相对于 UTC 的时差 date 存储日期和时间, 不带时区, 精确到秒 timestamp 存储日期和时间, 不带时区, ...

  9. python3 时间、日期、时间戳的转换

    1.简介 在编写代码时,往往涉及时间.日期.时间戳的相互转换. 2.示例 # 引入模块 import time, datetime 2.1 str类型的日期转换为时间戳 # 字符类型的时间 tss1 ...

最新文章

  1. 【转载】关于RabbitMQ的消息确认
  2. suse LINUX系统中的,用户权限的问题。
  3. 如何确定h.264的码率
  4. C++的冒泡排序法的原理是什么?
  5. (转)解决PowerDesigner 反向工程没有注释(备注)
  6. 《Redis开发与运维》读书笔记
  7. ## 2019-8-30 光滑粒子流体力学开源软件(Dual)sphysics使用中遇到的一些问题1
  8. Excel 计算标准差
  9. sql分组排序,查询每组第一个数据
  10. 二进制、八进制、十六进制的写法
  11. PROE产品设计:20个机械设计知识点
  12. python从入门到入魔第三天——time库和datetime库基本使用
  13. leetcode692:前K个高频单词
  14. 汽车软件大战一触即发,诚迈科技如何重构整车“软架构”
  15. arduino烧录esp8266出错:error: espcomm_upload_mem failed
  16. C++版 PPyolo+部署记录
  17. OTT广告价值「锋芒毕露」,谁能蚕食更大市场?
  18. 赛扬处理器_海尔逸15笔记本仅2299元,其酷睿10代赛扬处理器是什么情况?
  19. 体验为王的时代,如何提高售后服务环节的客户参与度?
  20. 谷神—阴阳和道的通道

热门文章

  1. .Net Core 集成 RabbitMQ 订阅与发送
  2. Godaddy注册的域名转发、转向教程
  3. 花花世界的flowers in December
  4. Java 深入掌握JMS:JSM基础
  5. Ubantu 一条命令安装宝塔
  6. OpenXLive支持 Windows Phone上的SNS 分享
  7. 布法罗计算机专业怎么样,布法罗大学 University at Buffalo
  8. Collections。API
  9. ildasm Reflector
  10. Vue表格实现隔行变色