【问题标题】:convert seconds elapsed since 1970 to current date format [duplicate]将自 1970 年以来经过的秒数转换为当前日期格式 [重复]
【发布时间】:2016-06-16 00:21:16
【问题描述】:
#include "stdafx.h"
#include <iostream>
#include <ctime>


using namespace std;
int main()
{

time_t now = time(NULL);

int sec = now % 60;

int min = ((now - sec) / 60) % 60;

int hour = ((((now - sec) / 60) - min) / 60) % 24;

int day = ((((((now - sec) / 60) - min) / 60) - hour) / 24) % 30;

int month = ((((((((now - sec) / 60) - min) / 60) - hour) / 24) - day) / 30) % 12;

int year = ((((((((((now - sec) / 60) - min) / 60) - hour) / 24) - day) / 30) - month) / 12) + 1970;

cout << hour << ":" << min << ":"<< ":" << day << ":" << month << ":" << year<<endl;
}

我不明白为什么月输出 10 而不是 3 ???

(我知道有 c_time 函数,但我正在学习并制作自己的函数)

【问题讨论】:

  • I can't understand why month output 10 instead of 3 ??? 因为月份不是 30 天
  • 一个月的天数可以是28、29、30、31,为什么用30?
  • 还有闰秒:)
  • @EdHeal,它和安卓有什么关系?
  • @SergeyA - 请不要混淆这个可怜的家伙

标签: c++ time


【解决方案1】:

time() 函数返回自 1970 年 1 月 1 日以来的秒数。

将其转换为日期比您想象的要复杂得多:

  • 从计算秒数开始:取数字%60 原则上应该告诉当前分钟的秒数。这似乎很明显。但这并不准确:它没有考虑到自 1970 年以来发生的25 leap seconds
  • 分钟,如果您考虑到第一次更正(最后考虑夏令时,如果此代码未在冬季运行),几小时就可以了
  • 您对月份日期的计算没有考虑并非所有月份都是 30 天这一事实,也没有考虑闰年。
  • 基本上,月份和年份的计算会受到月份错误估计的影响。

帮自己一个忙,使用gmtime()localtime() 等标准函数转换日期并访问struct tm 的字段

【讨论】:

    【解决方案2】:

    将秒转换为天/小时/分钟是微不足道的。将 1970 年以来的天数转换为当前日期不是。如果可以的话,您应该使用库函数,或者您可以使用为Julian day 提供的公式,请注意 1/1/1970 不是儒略日的 0。

    PS减法提醒完全没必要:

    int min = ((now - sec) / 60) % 60;
    

    应该是:

    int min = now / 60 % 60;
    

    甚至更好:

    int sec = now % 60;
    now /= 60;
    int min = now % 60;
    now /= 60;
    

    等等。

    【讨论】:

      【解决方案3】:

      将“自纪元以来的秒数”转换为日/月/年/等是一项极其艰巨的任务。

      这就是图书馆为您服务的原因。有专门为此设计的gmtime_r()localtime()_r。不幸的是,这些函数不是标准的,唯一的标准是线程不安全gmtime()localtime()

      【讨论】:

        猜你喜欢
        • 2011-08-31
        • 1970-01-01
        • 1970-01-01
        • 2023-01-08
        • 1970-01-01
        • 2012-01-19
        • 2017-01-09
        • 2013-01-20
        • 1970-01-01
        相关资源
        最近更新 更多