如何把获取的系统时间转换成年、月、日、时、分、秒

yumangmang 2008-05-16 03:56:43
我使用一个脚本语言里面有个GetTime()函数,可以获取系统时间,但是函数返回的是一个巨大的整数,我做了如下的处理:

systime = GetTime();
second = systime % 60;
minute = (systime % 3600) / 60;
hour = ......
year = ......


结果发现只有秒和分是能和系统时间完全匹配的,其他的都匹配不了,年的结果是38,我估计可能是从1970年以后算起,所以给年数加了个1970就得到了2008年(就算是瞎搞好了),对了,我计算的时候都是以一年365天,每天24小时,每小时3600秒计算的,但是年和小时的结果都不对,是不是因为时间不够精确?比如一天不能按照24小时计算??
...全文
1069 27 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
yumangmang 2008-05-19
  • 打赏
  • 举报
回复
上面的代码由几个错误的地方,更正一下:

void main()
{
int times,temp;
int t_year ,t_month; //很奇怪,用于pout的ar,month,day,hour,minute,second不能在这里定义,否则不干活。
int months[12]; //这样初始化数组是错的:int months[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
months[0] = 31;
months[1] = 28;
months[2] = 31;
months[3] = 30;
months[4] = 31;
months[5] = 30;
months[6] = 31;
months[7] = 31;
months[8] = 30;
months[9] = 31;
months[10] = 31;
months[11] = 31;

times = GetTime() + 28800; //系统计时从1970年早上8点开始
t_year = 1970;
t_month = 0;


//get year
for(;;)
{
temp = times;
if(((t_year % 4 == 0) && (t_year % 100 != 0)) || (t_year % 400 ==0))
times = times - 31622400;
else
times = times - 31536000;
if(times < 0)
{
times = temp;
break;
}
t_year++;
}
if(((t_year % 4 == 0) && (t_year % 100 != 0)) || (t_year % 400 ==0))
months[1] = 29;
else
months[1] = 28;

//get months
for(;;)
{
temp = times;
times = times - months[t_month] * 86400;
if(times < 0)
{
times = temp;
break;
}
t_month++;
}

year = t_year;
month = t_month + 1; //月份不是从零开始,而是从1开始

day = times / 86400 + 1; //天数不是从零开始,而是从1开始
hour = (times % 86400) / 3600;
minute = (times % 3600) / 60;
second = times % 60;
}
yumangmang 2008-05-19
  • 打赏
  • 举报
回复
非常感谢大家的支持,最后我用了差不多是最蠢的办法,就是一点儿一点的减,看看啥时候是减没了,当然语法类似C++,不过毕竟是脚本的语法,不会太严谨。
对了,提问在这个地方并没有问错地方,因为我觉得C++论坛高手多,呵呵。
脚本代码如下:

void main()
{
int times,temp;
int t_year ,t_month,t_day; //很奇怪,用于对外输出的pout的变量year,month,day,hour,minute,second不能在这里定义,
//否则不干活。
int months[12]; //这样初始化数组是错的:int months[12] = {31,28,31,30,31,30,31,31,30,31,30,31};真是奇怪。
months[0] = 31;
months[1] = 28;
months[2] = 31;
months[3] = 30;
months[4] = 31;
months[5] = 30;
months[6] = 31;
months[7] = 31;
months[8] = 30;
months[9] = 31;
months[10] = 31;
months[11] = 31;
bool RunNian = false;

times = GetTime() + 28800; //系统计时从1970年早上8点开始
t_year = 1970;
t_month = 1;
t_day = 1;


//get year
for(;;)
{
temp = times;
if(((t_year % 4 == 0) && (t_year % 100 != 0)) || (t_year % 400 ==0)) //判断闰年
times = times - 31622400;
else
times = times - 31536000;
if(times < 0)
{
times = temp;
break;
}
t_year++;
}
if(((t_year % 4 == 0) && (t_year % 100 != 0)) || (t_year % 400 ==0)) //判断大二月
months[1] = 29;
else
months[1] = 28;

//get months
for(;;)
{
temp = times;
times = times - months[t_month] * 86400;
if(times < 0)
{
times = temp;
break;
}
t_month++;
}

year = t_year; //年的输出值;
month = t_month; //月的输出值;

day = times / 86400; //日的输出值;
hour = (times % 86400) / 3600; //小时的输出值;
minute = (times % 3600) / 60; //分钟的输出值;
second = times % 60; //秒的输出值
}
anghoo 2008-05-18
  • 打赏
  • 举报
回复
不是平年,闰年的问题吗?
two_ears 2008-05-17
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 yumangmang 的回复:]
1天或许是23小时56分钟多一点吧,无所谓了。
这个争论没有用,写个表达式出来结果能和系统时间对上就说明问题,当然了前提是假设只知道秒数。
[/Quote]
唉,lz这么渊博,不过您是要研究天文还是历法呀?编程序算个日子用不着吧?
没听说过哪个日常用的时钟是走23小时56分钟的。lz钻牛角尖了。
舉杯邀明月 2008-05-17
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 Turntogo 的回复:]
引用 21 楼 Chen8013 的回复:
引用 12 楼 yumangmang 的回复:
说白了就是如果现在只能获得一个整数的时间(就是秒数),其余的计算年月日时分秒的函数都要自己写,怎么写?


也许楼主本身就走错了方向!

...........

不是天,是年,同志!
[/Quote]

对,是年。
我都晕头了 ^_^
星光伴月 2008-05-17
  • 打赏
  • 举报
回复
这好像不是C/C++的问题吧,楼主是不是进错了地盘了?
星光伴月 2008-05-17
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 Chen8013 的回复:]
引用 12 楼 yumangmang 的回复:
说白了就是如果现在只能获得一个整数的时间(就是秒数),其余的计算年月日时分秒的函数都要自己写,怎么写?


也许楼主本身就走错了方向!

你确认 GetTime() 返回的是“整数的时间(就是秒数)”吗?
如果是这样的话:
整数的最大值是:2147483647秒 ===> 68.1天。
就算是无符号的:4294967295秒 ===> 136.2天。

这么短的范围,如何包含“年、月、日”???
[/Quote]

不是天,是年,同志!
舉杯邀明月 2008-05-17
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 yumangmang 的回复:]
说白了就是如果现在只能获得一个整数的时间(就是秒数),其余的计算年月日时分秒的函数都要自己写,怎么写?
[/Quote]

也许楼主本身就走错了方向!

你确认 GetTime() 返回的是“整数的时间(就是秒数)”吗?
如果是这样的话:
整数的最大值是:2147483647秒 ===> 68.1天。
就算是无符号的:4294967295秒 ===> 136.2天。

这么短的范围,如何包含“年、月、日”???
舉杯邀明月 2008-05-16
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 yumangmang 的回复:]
哦,非常可惜,我这个virtools脚本,没有提供那么丰富的时间函数,只有一个GetTime()函数,其余的都要自己搞,哎,咋办呢?
[/Quote]

你没注意是先 New 一个 Date对象 吗?
其它的函数都是由这个对象来调用的。

当然,你说的 virtools脚本 我也没见过,不知道是否也有这个对象。
zsxcn 2008-05-16
  • 打赏
  • 举报
回复
mark
yumangmang 2008-05-16
  • 打赏
  • 举报
回复
1天或许是23小时56分钟多一点吧,无所谓了。
这个争论没有用,写个表达式出来结果能和系统时间对上就说明问题,当然了前提是假设只知道秒数。
two_ears 2008-05-16
  • 打赏
  • 举报
回复
假如返回的秒数是从1900年开始,那就算你一个月一个月的减掉也用不了多长时间,是不是闰年也不难判断
1天为什么不是24*60*60秒?哈,lz不要把简单问题想得复杂了
yumangmang 2008-05-16
  • 打赏
  • 举报
回复
问题是:
1分钟是60秒
1小时是60分
1天是24小时?
1年是365天?
1天应该算多少秒?应该不是 24*60*60
1年应该算多少秒?应该不是 365*24*60*60

其实无非就是 求余 和 整数除法 之类的,但是找不到准确可以应用的数值。
yumangmang 2008-05-16
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 two_ears 的回复:]
引用 12 楼 yumangmang 的回复:
说白了就是如果现在只能获得一个整数的时间(就是秒数),其余的计算年月日时分秒的函数都要自己写,怎么写?

那你剩下的不就是数学运算了么?还问什么?
[/Quote]
说的对,就剩下数学运算了,问题是怎么算?貌似不太容易,关键是除了秒和分以外,其余的都和系统时间对不上!!
two_ears 2008-05-16
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 yumangmang 的回复:]
说白了就是如果现在只能获得一个整数的时间(就是秒数),其余的计算年月日时分秒的函数都要自己写,怎么写?
[/Quote]
那你剩下的不就是数学运算了么?还问什么?
yumangmang 2008-05-16
  • 打赏
  • 举报
回复
说白了就是如果现在只能获得一个整数的时间(就是秒数),其余的计算年月日时分秒的函数都要自己写,怎么写?
yumangmang 2008-05-16
  • 打赏
  • 举报
回复
楼上两位仁兄写的都对,但是都是基于c语言的,我这个就是个脚本,只有个GetTime()函数,只能得到个整数,其余的就都要自己换算,请问怎么算呢?
baihacker 2008-05-16
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <time.h>
#include <string.h>
int main()
{
time_t result = time(NULL);
struct tm t;
memcpy(&t, localtime(&result), sizeof(struct tm));
printf("%d-%d-%d\t%d:%d:%d\n", t.tm_year + 1900, t.tm_mon,
t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec);
printf("%s\n", ctime(&result));
return 0;
}
  • 打赏
  • 举报
回复


struct tm
{
int tm_sec; /* seconds after the minute - [0,59] */
int tm_min; /* minutes after the hour - [0,59] */
int tm_hour; /* hours since midnight - [0,23] */
int tm_mday; /* day of the month - [1,31] */
int tm_mon; /* months since January - [0,11] */
int tm_year; /* years since 1900 */
int tm_wday; /* days since Sunday - [0,6] */
int tm_yday; /* days since January 1 - [0,365] */
int tm_isdst;/* daylight savings time flag */
};
/* 以上是tm结构体介绍,以下是一段获取当前系统年月日的程序 */

#include <time.h>

main()
{
char *pDate;
char cDate[] = "00000000";
time_t timep;
struct tm *p;
time(&timep);

p = gmtime(&timep);
printf("%d%02d%d",(1900 + p -> tm_year),(1 + p -> tm_mon),p -> tm_mday);
sprintf(cDate,"%d%02d%d",
(1900 + p -> tm_year),(1 + p -> tm_mon),p -> tm_mday);
printf("\ncDate=%s\n",cDate);
pDate = cDate;
printf("\npDate=%s\n",pDate);
}

noky 2008-05-16
  • 打赏
  • 举报
回复
systime = GetTime();
second = systime % 60;
minute = (systime % 3600) / 60;
hour = ......
year = ......
我没有碰到这样的情况,是不是这个时间整数是反向的呢。就好像IP地址一样是反的,
不知道对不对,你只有去try一下了。
加载更多回复(7)

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧