C语言实现将时间戳转换为年月日时分秒和将年月日时分秒转换为时间戳

Wesley13
• 阅读 1217
#include<stdio.h>
#include<string.h>

typedef unsigned int time_t;

struct tm {
  int tm_sec; /* 秒 – 取值区间为[0,59] */
  int tm_min; /* 分 - 取值区间为[0,59] */
  int tm_hour; /* 时 - 取值区间为[0,23] */
  int tm_mday; /* 一个月中的日期 - 取值区间为[1,31] */
  int tm_mon; /* 月份(从一月开始,0代表一月) - 取值区间为[0,11] */
  int tm_year; /* 年份,其值等于实际年份减去1900 */
};
const char Days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
void localtime(time_t time,struct tm *t)
{
  unsigned int Pass4year;
  int hours_per_year;

  if(time < 0)
  {
    time = 0;
  }
  //取秒时间
  t->tm_sec=(int)(time % 60);
  time /= 60;
  //取分钟时间
  t->tm_min=(int)(time % 60);
  time /= 60;
  //取过去多少个四年,每四年有 1461*24 小时
  Pass4year=((unsigned int)time / (1461L * 24L));
  //计算年份
  t->tm_year=(Pass4year << 2) + 1970;
  //四年中剩下的小时数
  time %= 1461L * 24L;
  //校正闰年影响的年份,计算一年中剩下的小时数
  for (;;)
  {
    //一年的小时数
    hours_per_year = 365 * 24;
    //判断闰年
    if ((t->tm_year & 3) == 0)
    {
      //是闰年,一年则多24小时,即一天
      hours_per_year += 24;
    }
    if (time < hours_per_year)
    {
      break;
    }
    t->tm_year++;
    time -= hours_per_year;
  }
  //小时数
  t->tm_hour=(int)(time % 24);
  //一年中剩下的天数
  time /= 24;
  //假定为闰年
  time++;
  //校正闰年的误差,计算月份,日期
  if((t->tm_year & 3) == 0)
  {
    if (time > 60)
    {
      time--;
    }
    else
    {
      if (time == 60)
      {
        t->tm_mon = 1;
        t->tm_mday = 29;
        return ;
      }
    }
  }
  //计算月日
  for (t->tm_mon = 0; Days[t->tm_mon] < time;t->tm_mon++)
  {
    time -= Days[t->tm_mon];
  }

  t->tm_mday = (int)(time);

  return;
}

static time_t 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},
};

int isleap(int year)
{
  return (year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0);
}

time_t mktime(struct tm dt)
{
  time_t result;
  int i =0;
  // 以平年时间计算的秒数
  result = (dt.tm_year - 1970) * 365 * 24 * 3600 +
  (mon_yday[isleap(dt.tm_year)][dt.tm_mon-1] + dt.tm_mday - 1) * 24 * 3600 +
  dt.tm_hour * 3600 + dt.tm_min * 60 + dt.tm_sec;
  // 加上闰年的秒数
  for(i=1970; i < dt.tm_year; i++)
  {
    if(isleap(i))
    {
      result += 24 * 3600;
    }
  }
  return(result);
}

void main()
{
  time_t time = 0;
  time_t time2 = 0;
  long i = 0;
  struct tm t;
  //2018-01-01 01:01:01
  time = 1514768461;
  // 验证一个周期4年 一天打印一次
  for(i=0;i<(4*365+1);i++)
  {
    localtime(time,&t);
    printf("A time:%d\r\n",time);
    printf("A %04d-%02d-%02d %02d:%02d:%02d\r\n",t.tm_year,t.tm_mon+1,t.tm_mday,t.tm_hour,t.tm_min,t.tm_sec);

    t.tm_mon+=1;    //转换时月份需要加1,因为月份是从0开始的
    time2 = mktime(t);    //将localtime得到年月日时分秒再次转换成时间戳,验证算法是否正确
    printf("B time:%d\r\n",time2);
    memset((void*)&t,0x00,sizeof(t));
    localtime(time2,&t);
    printf("B %04d-%02d-%02d %02d:%02d:%02d\r\n",t.tm_year,t.tm_mon+1,t.tm_mday,t.tm_hour,t.tm_min,t.tm_sec);
    memset((void*)&t,0x00,sizeof(t));
    time += 24*3600;
  }

  return;
}
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表(关于日期时间时分秒显示不出来)
在使用皕杰报表设计器时,数据据里面是日期型,但当你web预览时候,发现有日期时间类型的数据时分秒显示不出来,只有年月日能显示出来,时分秒显示为0:00:00。1.可以使用tochar解决,数据集用selecttochar(flowdate,"yyyyMMddHH:mm:ss")fromtablename2.也可以把数据库日期类型date改成timestamp
Karen110 Karen110
3年前
​一篇文章总结一下Python库中关于时间的常见操作
前言本次来总结一下关于Python时间的相关操作,有一个有趣的问题。如果你的业务用不到时间相关的操作,你的业务基本上会一直用不到。但是如果你的业务一旦用到了时间操作,你就会发现,淦,到处都是时间操作。。。所以思来想去,还是总结一下吧,本次会采用类型注解方式。time包importtime时间戳从1970年1月1日00:00:00标准时区诞生到现在
Wesley13 Wesley13
3年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Stella981 Stella981
3年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
3年前
HIVE 时间操作函数
日期函数UNIX时间戳转日期函数: from\_unixtime语法:   from\_unixtime(bigint unixtime\, string format\)返回值: string说明: 转化UNIX时间戳(从19700101 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式举例:hive   selec
Stella981 Stella981
3年前
Python time模块 返回格式化时间
常用命令  strftimetime.strftime("%Y%m%d%H:%M:%S",formattime)第二个参数为可选参数,不填第二个参数则返回格式化后的当前时间日期201812112:00:00time.strftime('%H:%M:%S')返回当前时间的时分秒time.strftim
Stella981 Stella981
3年前
Nginx反向代理upstream模块介绍
!(https://oscimg.oschina.net/oscnet/1e67c46e359a4d6c8f36b590a372961f.gif)!(https://oscimg.oschina.net/oscnet/819eda5e7de54c23b54b04cfc00d3206.jpg)1.Nginx反