c - C struct tm time - 添加小时
问题描述
我有struct tm
那个代表时间1900-01-01 00:00:00
。如何在小时内添加偏移量?例如,我已经抵消了小时 - 价值1048621
(大约 119.7 年)。
解决方案
假设生成的日期/时间落入由 表示的范围内time_t
,您可以添加小时偏移量,tm::tm_hour
然后调用mktime
规范化。
#include <time.h>
#include <stdio.h>
int main()
{
struct tm t = { 0 };
t.tm_mday = 1; // Jan 1st 1900
t.tm_hour = 1048621;
if(mktime(&t) == -1) return 1;
printf("%d-%02d-%02d %02d:%02d:%02d\n",
t.tm_year + 1900, t.tm_mon + 1, t.tm_mday,
t.tm_hour, t.tm_min, t.tm_sec);
return 0;
}
输出:
2019-08-17 13:00:00
[编辑] 正如评论中所指出的,上述mktime
调用因 MSVC 而失败。事实证明,微软的mktime
实现对参数进行了预检查,如果之前/甚至不查看其他字段tm
,则无条件失败。如果结束日期/时间超出该范围,则预计会失败,特别是如果它早于纪元的开始(通常是 1970 年 1 月 1 日),但通常应在(重新)标准化之后进行此类检查。tm_year < 69
tm
mktime
time_t
下面是添加范围验证的更新代码,并已验证可与gcc和msvc一起使用。
#include <time.h>
#include <limits.h>
#include <stdio.h>
int main()
{
const int tmYear1970 = 70;
const int tmDay1970 = tmYear1970 * 365 + tmYear1970 / 4; // 25568
const int tmHour1970 = tmDay1970 * 24; // 613632
const int tmHourMax = INT_MAX - tmHour1970; // 2146870015
int tmHour = 1048621;
if(tmHour < tmHour1970 || tmHour > tmHourMax) return 2;
struct tm t = { 0 };
t.tm_mday = 1; // Jan 1st 1900 12 AM
t.tm_year = tmYear1970;
t.tm_hour = tmHour - tmHour1970;
t.tm_isdst = -1;
if (mktime(&t) == -1) return 1;
printf("%d-%02d-%02d %02d:%02d:%02d\n",
t.tm_year + 1900, t.tm_mon + 1, t.tm_mday,
t.tm_hour, t.tm_min, t.tm_sec);
return 0;
}
推荐阅读
- c# - 使用 AseDataAdapter.Fill() 方法的 sybase 列是否有最大字符限制?
- apache-spark - Apache Spark:用分号替换特定列中的每个点
- javascript - Typescript 项目 - 如何将导入的模块合并到最终构建中?
- javascript - 使用 ews-javascript-api 更新交流会议时出错
- python - 重新排序数据框的列索引
- html - IE11 Drag And Drop 在拖动时更改光标指针
- express - 在 express 中使用模型和控制器时,我似乎无法找到工作路线
- node.js - 带有等待异步问题的循环迭代
- android - 移动设备上的按钮动态填充/高度问题
- liquibase - 推荐的 Liquibase 挂钩,将执行的 SQL 审计到数据库表中