我想得到午夜以来的秒数。
这是我的第一个猜测:
time_t current;
time(¤t);
struct tm dateDetails;
ACE_OS::localtime_r(¤t, &dateDetails);
// Get the current session start time
const time_t yearToTime = dateDetails.tm_year - 70; // year to 1900 converted into year to 1970
const time_t ydayToTime = dateDetails.tm_yday;
const time_t midnightTime = (yearToTime * 365 * 24 * 60 * 60) + (ydayToTime* 24 * 60 * 60);
StartTime_ = static_cast<long>(current - midnightTime);
答案 0 :(得分:12)
您可以使用标准C API:
time()
。struct tm
或gmtime_r()
将其转换为localtime_r()
。tm_sec
,tm_min
,tm_hour
设置为零。time_t
将其转换回mktime()
。time_t
值与新值之间的差异。示例:
#include <time.h>
#include <stdio.h>
time_t
day_seconds() {
time_t t1, t2;
struct tm tms;
time(&t1);
localtime_r(&t1, &tms);
tms.tm_hour = 0;
tms.tm_min = 0;
tms.tm_sec = 0;
t2 = mktime(&tms);
return t1 - t2;
}
int
main() {
printf("seconds since the beginning of the day: %lu\n", day_seconds());
return 0;
}
答案 1 :(得分:4)
一天中的秒数也是一个模数:
return nbOfSecondsSince1970 % (24 * 60 * 60)
答案 2 :(得分:1)
这是另一种可能的解决方案:
time_t stamp=time(NULL);
struct tm* diferencia=localtime(&stamp);
cout << diferencia->tm_hour*3600;
我认为更简单,我尝试了上面的解决方案,但它在VS2008中无效。
P.S。:对不起我的英语。
编辑:这将输出始终相同的数字,因为它只乘以小时数 - 所以如果它的2:00 AM将始终输出7200.请改为使用:
time_t stamp=time(NULL);
struct tm* diferencia=localtime(&stamp);
cout << ((diferencia->tm_hour*3600)+(diferencia->tm_min*60)+(diferencia->tm_sec));
答案 3 :(得分:1)
即使在 11 年后,仍有一些改进:
改进了 DST 处理
错误检查
适当的time_t
减法
代码:
#include <ctime>
// Error: return -1
// Success: return [0 ... 90,000) (not 86,400 due to DST)
double seconds_since_local_midnight() {
time_t now;
if (time(&now) == -1) {
return -1;
}
struct tm timestamp;
if (localtime_r(&now, ×tamp) == 0) { // C23
return -1;
}
timestamp.tm_isdst = -1; // Important
timestamp.tm_hour = 0;
timestamp.tm_min = 0;
timestamp.tm_sec = 0;
time_t midnight = mktime(×tamp);
if (midnight == -1) {
return -1;
}
return difftime(now, midnight);
}
其他答案的失败:
不考虑午夜和现在之间的夏令时变化:
Similar code、mod、struct tm math
缺乏错误处理:
Similar code、mod、struct tm math
使用世界时(显然 OP 需要当地时间):
mod、struct tm math
假设 time_t
是以秒为单位的整数类型计数:
Similar code UB 印刷中,mod
由于乘法溢出导致 int
为 16 位时失败:
mod
不使用小数秒(当它们存在时):
Similar code、mod、struct tm math