【问题标题】:Calculate seconds between NSDates in C计算 C 中 NSDates 之间的秒数
【发布时间】:2016-04-10 20:39:23
【问题描述】:

我正在编写一个 Arduino 脚本,它是 C/C++。该脚本的关键功能之一是从 API 读取日期并计算距离该日期时间还剩多少秒。

一个典型的值是 2016-04-10T02:36:00+02:00 这似乎是一个 NSDate。我找到了很多解决方案来完成我在 Objective-C 中想要的,但不是在 C/C++ 中。

任何帮助将不胜感激。

【问题讨论】:

  • 从单个时间分量(年/月/日/小时/分钟/秒/时区)计算纪元时间的公式是(或应该是)大多数高中级计算机编程中的家庭作业培训班。这并不复杂。可悲的是,这个轮子不断被重新发明,我不知道提供它的通用库,但显而易见的事实是股票 POSIX API 对此很糟糕,除非您需要转换为/从本地系统时区。只需系紧腰带,提高一个档次,然后自己计算。这并不难。
  • 没有“C/C++”之类的东西。您实际使用什么语言?
  • @LightnessRacesinOrbit Arduino 是一种自己的编程语言,据我了解,您可以在其中使用 C 和 C++。
  • @poff:是的,但你在任何时候都只能用一种语言写作。哪一款适合你?
  • @LightnessRacesinOrbit 我正在用 Arduino 编程。这与 C 相似,应该可以使用 C 函数(至少稍作修改)

标签: c++ c arduino posix


【解决方案1】:

要在 C 中计算以秒为单位的差异,请使用difftime(),它返回以秒表示的差异。

double difftime(time_t time1, time_t time0);

如果需要,要获取当前时间,请使用 time()。它决定了当前的日历时间。

time_t time(time_t *timer);

剩下的就是如何将“2016-04-10T02:36:00+02:00”之类的字符串转换为time_t

  1. 将字符串转换为数字部分。

    if (8 == sscanf(buf, "%d-%d-%dT%d:%d:%d%d:%d", &y, &m, ..., &tzh, &tzm)) Success();
    
  2. y,m,d ... 转换为struct tm

    struct tm tm = {0};  // Important to first zero fill
    tm.tm_year = y - 1900;
    tm.tm_mon = m - 1;
    tm.tm_mday = d;
    ...
    tm.tm_hour = H + tzh;
    tm.tm_min = M + tzm*sign(tzh);
    tm.tm_sec = S;
    
  3. struct tm(通用时间)转换为time_t。这一步很难,因为 C 没有提供明确的标准方法来做到这一点。 This 这是一个合理的可移植方法。有关替代方法,请参阅帖子的其余部分。

请注意,没有假设(或不需要)time_t 是自 1970 年以来的秒数,也没有假设 struct tm 只有 9 个字段。

【讨论】:

    猜你喜欢
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2016-08-14
    相关资源
    最近更新 更多