【问题标题】:Converting unix timestamp to YYYY-MM-DD HH:MM:SS将 unix 时间戳转换为 YYYY-MM-DD HH:MM:SS
【发布时间】:2009-08-14 20:33:25
【问题描述】:

我有一个 Unix 时间戳,我需要从中获取单独的年、月、日、小时、分钟和秒值。我在数学课上从来都不是很好,所以我想知道你们能不能帮帮我:)

我必须自己做所有事情(没有 time.h 函数)。语言是 C。

【问题讨论】:

  • 什么语言?是否允许使用 SDK 库?
  • 问题被标记为 C。

标签: c unix math timestamp


【解决方案1】:

免责声明:以下代码不考虑leap years leap seconds [Unix 时间不考虑闰秒。无论如何,他们被高估了。 -Ed]。另外,我没有测试它,所以可能有错误。它可能会踢你的猫并侮辱你的母亲。祝你有美好的一天。

让我们尝试一些伪代码(真的是 Python):

# Define some constants here...

# You'll have to figure these out.  Don't forget about February (leap years)...
secondsPerMonth = [ SECONDS_IN_JANUARY, SECONDS_IN_FEBRUARY, ... ]

def formatTime(secondsSinceEpoch):
    # / is integer division in this case.
    # Account for leap years when you get around to it :)
    year = 1970 + secondsSinceEpoch / SECONDS_IN_YEAR
    acc = secondsSinceEpoch - year * SECONDS_IN_YEAR

    for month in range(12):
        if secondsPerMonth[month] < acc:
            acc -= month
            month += 1

    month += 1

    # Again, / is integer division.
    days = acc / SECONDS_PER_DAY
    acc -= days * SECONDS_PER_DAY

    hours = acc / SECONDS_PER_HOUR
    acc -= hours * SECONDS_PER_HOUR

    minutes = acc / SECONDS_PER_MINUTE
    acc -= minutes * SECONDS_PER_MINUTE

    seconds = acc

    return "%d-%d-%d %d:%d%d" % (year, month, day, hours, minutes, seconds)

如果我搞砸了,请告诉我。在 C 中执行此操作应该不会太难。

【讨论】:

  • 谢谢,这正是我所需要的 :)
  • 我没有注意到上面提到的闰年。正确实现 C 标准日期处理函数远非微不足道 - 尝试自己做通常不是一个好主意。
  • 我将编辑答案以更清楚地表明这不是一个完整的解决方案,而只是一个起点。我知道重新发明轮子通常是个坏主意,但我认为我们已经超越了那部分。
  • 我明白这不是一个完整的解决方案,我将照此办理。
  • 祝你好运 - 这很难。这方面的一本好书是 PJ Plauger 的《标准 C 库》,它都是关于实现此类库函数的。
【解决方案2】:

您真的不想手动执行此操作。您可以编写一些简单的代码,假设年、月、日、小时、分钟和秒的长度都相同(12 个月;28、30 或 31 天;24 小时;60 分钟;和 60 秒)然后得出回答错误。

要得到正确答案,你必须处理leap yearsleap seconds,并转换为本地time zone(使用正确的DST模式)。 (除非您选择仅以 UTC 时间显示。)

我建议你看看glibc 的代码,看看strftime 是如何工作的。


编辑: UNIX 时间不使用闰秒。

【讨论】:

  • 我实际上是在一个只支持 C 并且带有一些非常基本的库的平台上工作。
  • (不是作业,我使用时间戳让它更经济地存储)
  • 你知道我在哪里可以找到可以为我进行转换的函数吗?
  • 大概你的平台不是UNIX,那么?在这种情况下,为什么要使用 UNIX 时间戳?
  • 我应该使用什么样的时间戳?
【解决方案3】:

这种格式通常称为ISO 8601,搜索它可能会对您有所帮助。

【讨论】:

    【解决方案4】:

    您应该进行搜索-前几天我发布了对这个问题 over here 的完整答案(至少对于 UTC-调整其他时区只需从之前的 unixtime 添加或减去时区偏移量(以秒为单位)你调用函数)。

    【讨论】:

      【解决方案5】:

      你不必做数学。这可以像这样在 C 中轻松处理,

      char *ISO_Time (
          time_t                  time
      )
      
      {
          static char             mStr[128];
          struct tm              *gmt;
      
          gmt = gmtime (&time);
      
          strftime (mStr, sizeof(mStr), "%Y-%m-%dT%H:%M:%SZ", gmt);
      
          return mStr;
      }
      

      由于你的不是ISO时间,你只需要改变一行,

      strftime (mStr, sizeof(mStr), "%Y-%m-%d %H:%M:%S", gmt);
      

      【讨论】:

      • 问题说“没有时间.h”
      • 哦。没有意识到我正在使用 time.h。然后只需复制 strftime()。这很复杂。绝对不值得重写。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-16
      • 1970-01-01
      • 2022-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-05
      相关资源
      最近更新 更多