【问题标题】:c++ Convert 4bytes to UTC timec++ 将 4bytes 转换为 UTC 时间
【发布时间】:2019-04-17 03:38:09
【问题描述】:

我想知道如何将 4bytes 值转换为 UTC 时间。 语言是 C++。

ex) 假设 4 个字节的 UTC 为 0xACE62100,那么对应的分割时间将是 2000 年 1 月 26 日,17:09:00

【问题讨论】:

  • 您好,欢迎来到 SO。您发布的问题似乎根本不包括解决问题的任何尝试。 StackOverflow 希望您首先尝试解决自己的问题,因为您的尝试有助于我们更好地了解您想要什么。请编辑问题以显示您尝试过的内容,以说明您在minimal reproducible example 中遇到的特定问题。欲了解更多信息,请参阅How to Ask 并拨打Tour
  • 如果我计算正确,小时、分钟、秒、日和月单独占用至少 26 位。 char[4] 有 32 位。我想知道您如何处理一年的 6 位。
  • 这个值从何而来?应该如何解读?文件怎么说?您需要先了解这些基础,然后才能开始设计解决方案。
  • @BIN 您是否有这些神秘时间戳中的一个对应于 2006-01-01 之后的某个时间点?

标签: c++ date time utc


【解决方案1】:

仔细看,这似乎是一个小端值;以 Intel 顺序解释的字节字符串 ACE621000021E6ACwhen converted to seconds 给出:

25 days, 17 hours, 9 minutes and 0 seconds.

因此,您的时间似乎是自 2000 年 1 月 1 日午夜以来的小端秒数。

【讨论】:

  • 为什么是 1 月 2 日? 26 号之前的 25 天就是 1 号,不是吗?顺便说一句,天文学家似乎使用从 2000 年 1 月 1 日开始的纪元,但 UTC 时间是 12:00:00,而不是午夜。
  • 辛苦了一天...让我来解决这个问题!
【解决方案2】:

它看起来像一个以网络字节顺序发送的差异时间戳,因此您需要对其进行转换。在 *nix(可能还有其他)上,有 ntohl

#include <iostream>
#include <ctime>
#include <arpa/inet.h>

int main() {
    std::time_t ts_raw = 0xACE62100;           // your input
    std::time_t ts_nh = ntohl(ts_raw);

    std::cout << asctime(gmtime(&ts_nh));      // your input converted

    // hardcoded 2000-01-01 00:00:00 UTC epoch
    std::time_t epoch_time = 0x386D4380;
    std::cout << asctime(gmtime(&epoch_time)); // 2000-01-01 00:00:00

    ts_nh += epoch_time;
    std::cout << asctime(gmtime(&ts_nh));      // your expected result
}

输出

Mon Jan 26 17:09:00 1970
Sat Jan  1 00:00:00 2000
Wed Jan 26 17:09:00 2000

【讨论】:

  • 但是要得到正确的解决方案,我们需要了解输入的时基。它包括闰秒吗? OP 的规范(或缺少!)“4bytes value” 目前还不够。
  • 是的。差异还不足以确定是否包含闰秒。如果差异在 2006 年登陆我们,闰秒 @ 2005-12-31 可能会提供一些额外的信息。
猜你喜欢
  • 2013-02-03
  • 1970-01-01
  • 2017-04-27
  • 2012-02-02
  • 2018-07-27
  • 2021-09-05
  • 1970-01-01
  • 2021-12-31
相关资源
最近更新 更多