C语言实现时间戳转日期的算法
2017-06-14 14:38
489 查看
一.可以通过现有函数实现
C语言库函数:localtime就可以获得一个时间戳对应的具体日期了
在标准C/C++中,我们可通过tm结构来获得日期和时间,tm结构在time.h中的定义如下:
#ifndef _TM_DEFINED
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开始 */
int tm_wday; /* 星期–取值区间为[0,6],其中0代表星期天,1代表星期一,以此类推 */
int tm_yday; /* 从每年的1月1日开始的天数–取值区间为[0,365],其中0代表1月1日,1代表1月2日,以此类推 */
int tm_isdst; /* 夏令时标识符,实行夏令时的时候,tm_isdst为正。不实行夏令时的进候,tm_isdst为0;不了解情况时,tm_isdst()为负。*/
};
#define _TM_DEFINED
#endif
ANSI C标准称使用tm结构的这种时间表示为分解时间(broken-down time)。
可以使用的函数是gmtime()和localtime()将time()获得的日历时间time_t结构体转换成tm结构体。
其中gmtime()函数是将日历时间转化为世界标准时间(即格林尼治时间),并返回一个tm结构体来保存这个时间,而localtime()函数是将日历时间转化为本地时间。
#include <stdio.h>
#include <time.h>
int main(void)
{
struct tm *ptr;
time_t lt;
lt =time(NULL);
ptr=localtime(<);
printf("second:%d\n",ptr->tm_sec);
printf("minute:%d\n",ptr->tm_min);
printf("hour:%d\n",ptr->tm_hour);
printf("mday:%d\n",ptr->tm_mday);
printf("month:%d\n",ptr->tm_mon+1);
printf("year:%d\n",ptr->tm_year+1900);
return 0;
}
范例:
#include <time.h>
main(){
char *wday[] = {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
time_t timep;
structtm *p;
time(&timep);
p = localtime(&timep);//取得当地时间
printf ("%d%d%d ",(1900+p->tm_year),(l+p->tm_mon), p->tm_mday);
printf("%s%d:%d:%d\n", wday[p->tm_wday], p->tm_hour, p->tm_min, p->tm_sec);
}
执行结果:
2000/10/28 Sat 11:12:22
二.算法实现
时间是有周期规律的,4年一个周期(平年、平年、平年、闰年)共计1461天。Windows上C库函数time(NULL)返回的是从1970年1月1日以来的毫秒数,我们最后算出来的年数一定要加上这个基数1970。总的天数除以1461就可以知道经历了多少个周期;总的天数对1461取余数就可以知道剩余的不足一个周期的天数,对这个余数进行判断也就可以得到月份和日了。
static int DAYS = 24*3600;
static int FOURYEARS = 365*3+366;
static int norMoth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
static int leapMoth[] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
void getHourMinSec(int nSecond)
{
int nHour = nSecond/3600;
int nMin = (nSecond%3600)/60;
int nSec = (nSecond%3600)%60;
printf("%d:%d:%d\n", nHour+8, nMin, nSec);
}
void getMothAndDay(bool bLeapYear, int nDays, int *nMoth, int *nDay)
{
int i = 0;
int nTmp = 0;
int *pMoth = bLeapYear?leapMoth:norMoth;
for (i=0; i<12; i++)
{
nTmp = nDays-pMoth[i];
if (nTmp <= 0)
{
*nMoth = i+1;
if (nTmp == 0)
{
*nDay = pMoth[i];
}
else
{
*nDay = nDays;
}
break;
}
nDays = nTmp;
}
return;
}
void print_time()
{
time_t nTime = time(NULL);
int nDays = nTime/DAYS + ((nTime%DAYS)?1:0);
int nYear4 = nDays/FOURYEARS;
int nRemain = nDays%FOURYEARS;
int nDecyear = 1970 + nYear4*4;
int nDecmoth = 0;
int nDecday = 0;
bool bLeapyear = false;
if (nRemain < 365)
{
;
}
else if (nRemain < 365*2)
{
nDecyear += 1;
nRemain -= 365;
}
else if (nRemain < 365*3)
{
nDecyear += 2;
nRemain -= 365*2;
}
else
{
nDecyear += 3;
nRemain -= 365*3;
bLeapyear = true;
}
getMothAndDay(bLeapyear, nRemain, &nDecmoth, &nDecday);
printf("%d:%d:%d\n", nDecyear, nDecmoth, nDecday);
getHourMinSec(nTime%DAYS);
return;
}
int main(void)
{
print_time();
return 0;
}
C语言库函数:localtime就可以获得一个时间戳对应的具体日期了
在标准C/C++中,我们可通过tm结构来获得日期和时间,tm结构在time.h中的定义如下:
#ifndef _TM_DEFINED
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开始 */
int tm_wday; /* 星期–取值区间为[0,6],其中0代表星期天,1代表星期一,以此类推 */
int tm_yday; /* 从每年的1月1日开始的天数–取值区间为[0,365],其中0代表1月1日,1代表1月2日,以此类推 */
int tm_isdst; /* 夏令时标识符,实行夏令时的时候,tm_isdst为正。不实行夏令时的进候,tm_isdst为0;不了解情况时,tm_isdst()为负。*/
};
#define _TM_DEFINED
#endif
ANSI C标准称使用tm结构的这种时间表示为分解时间(broken-down time)。
格式转换
可以使用的函数是gmtime()和localtime()将time()获得的日历时间time_t结构体转换成tm结构体。其中gmtime()函数是将日历时间转化为世界标准时间(即格林尼治时间),并返回一个tm结构体来保存这个时间,而localtime()函数是将日历时间转化为本地时间。
程序举例
#include <stdio.h>#include <time.h>
int main(void)
{
struct tm *ptr;
time_t lt;
lt =time(NULL);
ptr=localtime(<);
printf("second:%d\n",ptr->tm_sec);
printf("minute:%d\n",ptr->tm_min);
printf("hour:%d\n",ptr->tm_hour);
printf("mday:%d\n",ptr->tm_mday);
printf("month:%d\n",ptr->tm_mon+1);
printf("year:%d\n",ptr->tm_year+1900);
return 0;
}
范例:
#include <time.h>
main(){
char *wday[] = {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
time_t timep;
structtm *p;
time(&timep);
p = localtime(&timep);//取得当地时间
printf ("%d%d%d ",(1900+p->tm_year),(l+p->tm_mon), p->tm_mday);
printf("%s%d:%d:%d\n", wday[p->tm_wday], p->tm_hour, p->tm_min, p->tm_sec);
}
执行结果:
2000/10/28 Sat 11:12:22
二.算法实现
时间是有周期规律的,4年一个周期(平年、平年、平年、闰年)共计1461天。Windows上C库函数time(NULL)返回的是从1970年1月1日以来的毫秒数,我们最后算出来的年数一定要加上这个基数1970。总的天数除以1461就可以知道经历了多少个周期;总的天数对1461取余数就可以知道剩余的不足一个周期的天数,对这个余数进行判断也就可以得到月份和日了。
static int DAYS = 24*3600;
static int FOURYEARS = 365*3+366;
static int norMoth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
static int leapMoth[] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
void getHourMinSec(int nSecond)
{
int nHour = nSecond/3600;
int nMin = (nSecond%3600)/60;
int nSec = (nSecond%3600)%60;
printf("%d:%d:%d\n", nHour+8, nMin, nSec);
}
void getMothAndDay(bool bLeapYear, int nDays, int *nMoth, int *nDay)
{
int i = 0;
int nTmp = 0;
int *pMoth = bLeapYear?leapMoth:norMoth;
for (i=0; i<12; i++)
{
nTmp = nDays-pMoth[i];
if (nTmp <= 0)
{
*nMoth = i+1;
if (nTmp == 0)
{
*nDay = pMoth[i];
}
else
{
*nDay = nDays;
}
break;
}
nDays = nTmp;
}
return;
}
void print_time()
{
time_t nTime = time(NULL);
int nDays = nTime/DAYS + ((nTime%DAYS)?1:0);
int nYear4 = nDays/FOURYEARS;
int nRemain = nDays%FOURYEARS;
int nDecyear = 1970 + nYear4*4;
int nDecmoth = 0;
int nDecday = 0;
bool bLeapyear = false;
if (nRemain < 365)
{
;
}
else if (nRemain < 365*2)
{
nDecyear += 1;
nRemain -= 365;
}
else if (nRemain < 365*3)
{
nDecyear += 2;
nRemain -= 365*2;
}
else
{
nDecyear += 3;
nRemain -= 365*3;
bLeapyear = true;
}
getMothAndDay(bLeapyear, nRemain, &nDecmoth, &nDecday);
printf("%d:%d:%d\n", nDecyear, nDecmoth, nDecday);
getHourMinSec(nTime%DAYS);
return;
}
int main(void)
{
print_time();
return 0;
}
相关文章推荐
- 时间戳转日期的算法(C语言实现)
- C语言实现时间戳转日期的算法(推荐)
- Windows环境是使用C语言计算程序或算法执行时间的不同粒度实现
- C语言 strftime 格式化显示日期时间的实现
- C语言实现时间差、星期、天数算日期(转)
- 归纳整理Linux下C语言常用的库函数----时间日期数学及算法
- 排序算法的C语言实现以及各个算法的时间复杂度和空间复杂度分析(冒泡排序)
- 二维、结构网格单相流SIMPLE 算法的C语言实现
- 一个UUID生成算法的C语言实现 --- WIN32版本
- C++继承性应用实例日期和时间(VC 6.0实现)
- 一个UUID生成算法的C语言实现 --- WIN32版本
- 一个UUID生成算法的C语言实现 --- WIN32版本
- C语言中实现 点在多边形内 算法
- C语言中对时间和日期的处理
- Linux下获得系统时间的C语言的实现方法
- Mr.刘的一段格式化日期时间输出实现
- 过桥时间最短的算法实现(TopCoder)
- 用javascript实现的日期时间输入控件
- JSP中有关时间和日期类的使用与JSP中的字符替换函数 str_replace()实现
- c语言对时间的处理函数和计时的实现