【问题标题】:How to convert struct tm to time_t by zeroing the hours ex: 00:00如何通过将小时数归零来将 struct tm 转换为 time_t:00:00
【发布时间】:2019-03-16 20:47:54
【问题描述】:
struct tm t;
mktime(&t)

这会返回类似1199246400 -> Tue Jan 1 02:00:00 2008

但我需要取回这个1199160000 -> Tue Jan 1 00:00:00 2008(现在是午夜)

如果我总是返回1199160000 -> Tue Jan 1 00:00:00 2008

我可以使用mktime(&t) - 60 * 120

更明显的是 tm_hour 不断变化

所以我需要它始终返回 date + 00:00:00,而不管 struct tm 中设置的 tm_hour 是什么

提前谢谢你

【问题讨论】:

  • 返回 1199160000 -> 日期 + 00:00:00
  • 你在初始化t的成员吗?
  • 不清楚你在问什么。你需要一个代表今天开始的 struct tm 吗? (昨天的午夜?)或者同一时刻的 time_t 值?
  • 你能设置t.tm_hour = 0;吗?
  • 我需要以秒为单位返回时间,小时数设置为 00:00:1199160000,就好像要舍入一样

标签: c date datetime time time.h


【解决方案1】:

要在当地时间今天开始时的午夜生成 Unix 时间戳:

#include <time.h>
#include <stdio.h>

int main(void)
{
    time_t now = time(0);
    struct tm *lt = localtime(&now);
    lt->tm_hour = 0;
    lt->tm_min = 0;
    lt->tm_sec = 0;
    time_t midnight = mktime(lt);
    printf("%ld\n", (long)midnight);
    return 0;
}

输出(2018-10-11 10:43 -07:00):

1539241200

随机时间转换实用程序:

$ timestamp 1539241200
1539241200 = Thu Oct 11 00:00:00 2018
$
  • 如果您不想要当地时间午夜,而是想要当前时间,请不要将 tm_hour 归零。
  • 如果您需要 UTC,请使用 gmtime() 而不是 localtime()。如果你想四舍五入(tm_hour &gt;= 12 映射到明天的午夜而不是今天的午夜),你必须测试要设置的内容。但请注意,mktime() 标准化了 tm_yeartm_montm_daytm_hourtm_mintm_sec 中的值——所以你可以简单地使用 lt-&gt;tm_day++; 切换到明天,并且即使在一个月末它也会正确转换(因此它不是很难舍入 - 您只需在将 lt-&gt;tm_hour 设置为零之前对条件进行编码:if (lt-&gt;tm_hour &gt;= 12) lt-&gt;tm_day++;)。
  • 如果你想处理任意时间,将值作为命令行参数(默认为time(0),当没有参数传递时),转换为time_t(可能通过strtoll()long long变量),然后将其传递给执行其余转换和打印的函数。

我们可以讨论格式化为long 并转换为long 是否最好;使用long long 甚至intmax_t 可能会更好。

【讨论】:

    猜你喜欢
    • 2015-05-06
    • 2018-06-04
    • 2019-12-08
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 2018-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多