计算今天的凌晨时间
2012-12-05 13:39
295 查看
鄙人在SuSE linux 64位服务器编程,今天有一个功能跟客户端同事联调,其中一步骤是关于今天的凌晨时间的判断,两边一直差异较大。
与他沟通之后,才知道是凌晨时间计算方法的差异。
客户端(windows)的同事的计算方法如下:
time_t cur_time = time(NULL);
time_t morning = cur_time - cur_time % 86400; //86400 = 24 * 60 * 60
貌似很简单,但是不正确,先给出提醒,中国的时区是在东八区。
下面是我的一段代码:
#include <stdio.h>
#include <time.h>
#include <string.h>
#define u8 unsigned int
#define n8 long int
n8 get_sec_of_morning(n8 sec) {
struct tm sec_tm;
localtime_r((time_t*)&sec, &sec_tm);
struct tm morning_tm;
memset(&morning_tm, 0, sizeof(morning_tm));
morning_tm.tm_year = sec_tm.tm_year;
morning_tm.tm_mon = sec_tm.tm_mon;
morning_tm.tm_mday = sec_tm.tm_mday;
return mktime(&morning_tm);
}
n8 get_sec_of_day(n8 sec) {
return sec - get_sec_of_morning(sec);
}
int main(int argc, char** argv) {
time_t sec = time(NULL);
time_t morning = get_sec_of_morning(sec);
printf("%ld, cur sec %s\n", sec, ctime(&sec));
printf("%ld, morning hour of today: %s\n", morning, ctime(&morning));
printf("time difference from morning: %ld\n", get_sec_of_day(sec))
time_t morning2 = sec - sec % 86400;
printf("%ld, cur sec %s\n", sec, ctime(&sec));
printf("%ld, morning hour of today: %s\n", morning2, ctime(&morning2));
return 0;
}
上面的程序在SuSE linux 64bit server上运行之后,根据运行结果,可以看到上面那个貌似简单的方法是谬之千里的原因就是time(time_t*)函数返回的是从1970年1月1日至今的秒数,即UTC时间,而非当前时区的当前时间。
函数get_sec_of_morning(n8)借助了localtime_r(time_t*, struct tm*)计算出本time zone的当前时间,然后进行时间计算,这一步是关键。
另外,函数get_sec_of_day(n8 sec)函数返回自秒sec所在当天的凌晨时间到秒sec的秒数difference。
与他沟通之后,才知道是凌晨时间计算方法的差异。
客户端(windows)的同事的计算方法如下:
time_t cur_time = time(NULL);
time_t morning = cur_time - cur_time % 86400; //86400 = 24 * 60 * 60
貌似很简单,但是不正确,先给出提醒,中国的时区是在东八区。
下面是我的一段代码:
#include <stdio.h>
#include <time.h>
#include <string.h>
#define u8 unsigned int
#define n8 long int
n8 get_sec_of_morning(n8 sec) {
struct tm sec_tm;
localtime_r((time_t*)&sec, &sec_tm);
struct tm morning_tm;
memset(&morning_tm, 0, sizeof(morning_tm));
morning_tm.tm_year = sec_tm.tm_year;
morning_tm.tm_mon = sec_tm.tm_mon;
morning_tm.tm_mday = sec_tm.tm_mday;
return mktime(&morning_tm);
}
n8 get_sec_of_day(n8 sec) {
return sec - get_sec_of_morning(sec);
}
int main(int argc, char** argv) {
time_t sec = time(NULL);
time_t morning = get_sec_of_morning(sec);
printf("%ld, cur sec %s\n", sec, ctime(&sec));
printf("%ld, morning hour of today: %s\n", morning, ctime(&morning));
printf("time difference from morning: %ld\n", get_sec_of_day(sec))
time_t morning2 = sec - sec % 86400;
printf("%ld, cur sec %s\n", sec, ctime(&sec));
printf("%ld, morning hour of today: %s\n", morning2, ctime(&morning2));
return 0;
}
上面的程序在SuSE linux 64bit server上运行之后,根据运行结果,可以看到上面那个貌似简单的方法是谬之千里的原因就是time(time_t*)函数返回的是从1970年1月1日至今的秒数,即UTC时间,而非当前时区的当前时间。
函数get_sec_of_morning(n8)借助了localtime_r(time_t*, struct tm*)计算出本time zone的当前时间,然后进行时间计算,这一步是关键。
另外,函数get_sec_of_day(n8 sec)函数返回自秒sec所在当天的凌晨时间到秒sec的秒数difference。
相关文章推荐
- 计算今天的凌晨时间
- iOS 计算某个时间距今天的天数
- 关于安卓中时间的计算(求上个月的今天)
- 由于出差的时间计算失误,今天只好坐公车去上下班了
- java 计算今天还剩多少时间
- C# 计算传入的时间距离今天的时间差
- java 计算过去的时间到今天的时间段
- 时间间隔计算(分钟前,今天,昨天,过去的时间)
- 时间计算,返回今天昨天明天,年月日
- [LINK]用Python计算昨天、今天和明天的日期时间
- 计算一个时间距离今天还有多少天
- java日期在今天的基础上加一个月。并计算时间相差天数
- php如何获取当日凌晨的时间戳&计算datetime类型时间差
- java的系统时间,怎么计算从现在到凌晨还剩下多少时间?
- PHP获得今天 天凌晨时间戳的例子
- 通过反射计算方法执行时间 包括out参数
- 分享一个时间消耗计算宏(oc)
- 计算机系统的时间的计算机制
- 根据日期、时间和当地经纬度计算太阳天顶角和方位角的原理
- C/C++中计算程序运行时间