RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1258293
Accepted
Максим Филимонов
Максим Филимонов
Asked:2022-03-20 03:41:37 +0000 UTC2022-03-20 03:41:37 +0000 UTC 2022-03-20 03:41:37 +0000 UTC

从秒转换为天、小时、分钟和秒

  • 772
struct my_time {
    long long day, hour, minute, second;
    void set(long long t) {
        if (t>=0) {
            day = t/60/60/24;   
            hour = t/60/60-day*24;
            minute = t/60-hour*60-day*24*60;
            second = t-minute*60-hour*60*60-day*60*60*24;
        } else if (t%86400==0) {
            day=t/86400;
            hour=0;
            minute=0;
            second=0;
        } else  {
            day = -1;
            day += t/86400;
            hour = abs(t/60/60-24*day-1);
            minute = abs(t/60-hour*60-24*60*day-1);
            second = (abs(t-minute*60-hour*60*60-60*60*24*day-1)+1)%60;
        }
    }
};

需要写一个时间结构体,set方法接收以秒为单位的秒数作为参数。当我进入方法时出现错误,例如-600。这些字段等于-1 23 49 0,但它们应该是-1 23 50 0。告诉我问题出在哪里。

c++
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    wololo
    2022-03-20T05:45:25Z2022-03-20T05:45:25Z

    我想你需要这样的东西:

    #include <iostream>
    #include <iomanip>
    using std::cout;
    using std::endl;
    
    struct my_time {
        long long day, hour, minute, second;
        my_time& set(long long t) {
            const long long SECONDS_IN_MINUTE = 60LL;
            const long long SECONDS_IN_HOUR   = SECONDS_IN_MINUTE * 60LL;
            const long long SECONDS_IN_DAY    = SECONDS_IN_HOUR   * 24LL;
            
            day = t / SECONDS_IN_DAY;
            t -= day * SECONDS_IN_DAY;
            if (t < 0) {
                --day;
                t += SECONDS_IN_DAY;
            }
            
            hour = t / SECONDS_IN_HOUR;
            t -= hour * SECONDS_IN_HOUR;
            
            minute = t / SECONDS_IN_MINUTE;
            t -= minute * SECONDS_IN_MINUTE;
                
            second = t;
            
            return *this;
        }
    };
    
    std::ostream& operator<<(std::ostream& out, const my_time& mt) {
        out              << " " << std::setw(3);
        out << mt.day    << " " << std::setw(2);
        out << mt.hour   << " " << std::setw(2);
        out << mt.minute << " " << std::setw(2);
        out << mt.second;
        return out;
    }
    
    void print(long long t) {
        cout << "t: " << std::setw(7) << t << "     my_time: " << my_time().set(t) << endl;
    }
    
    int main() {
        const long long test[] = {
            600, -600, 0,
             1,  86399,  86400,  86401,  172799,  172800,  172801,
            -1, -86399, -86400, -86401, -172799, -172800, -172801
        };
        for (auto t: test)
            print(t);
    }
    

    结论:

    t:     600     my_time:    0  0 10  0
    t:    -600     my_time:   -1 23 50  0
    t:       0     my_time:    0  0  0  0
    t:       1     my_time:    0  0  0  1
    t:   86399     my_time:    0 23 59 59
    t:   86400     my_time:    1  0  0  0
    t:   86401     my_time:    1  0  0  1
    t:  172799     my_time:    1 23 59 59
    t:  172800     my_time:    2  0  0  0
    t:  172801     my_time:    2  0  0  1
    t:      -1     my_time:   -1 23 59 59
    t:  -86399     my_time:   -1  0  0  1
    t:  -86400     my_time:   -1  0  0  0
    t:  -86401     my_time:   -2 23 59 59
    t: -172799     my_time:   -2  0  0  1
    t: -172800     my_time:   -2  0  0  0
    t: -172801     my_time:   -3 23 59 59
    
    • 5
  2. Павел Ериков
    2022-03-20T05:40:25Z2022-03-20T05:40:25Z

    我会以答案的形式写,只是因为评论的地方不够多,不好看。我根本没有提出正确的答案)只是一个想法。

    同意@wololo 非常奇怪的算术。

    但尝试这样做:

    如果t < 0,那么

    1. 摆脱标志。-t
    2. 以秒为单位求天数t,顺其自然day。
    3. 我们添加到day+ 1 并使用 - 符号。
    4. 我们从秒数中减去t秒数,以day天为单位。
    5. 最后一个操作是1 0 0 0 - t(секунд)。那是 1 天 -t秒。

    我希望我清楚地解释了这个想法。

    现在让我们看一个例子。让t = -2.

    1. t = -t = 2
    2. day = 0
    3. -(day + 1) = -1- 总天数
    4. t - day * 24 * 60 * 60 = t, 因为day = 0
    5. 1 0 0 0 - 0 0 0 2 = 0 23 59 58

    我们得到答案:-1 23 59 58

    再举一个例子。让t = -179429

    1. t = -t = 179429
    2. day = t / (24 * 60 * 60) = 2`
    3. -(day + 1) = -3- 总天数
    4. t - day * 24 * 60 * 60 = 6629
    5. 1 0 0 0 - 0 1 50 29 = 0 22 09 31

    我们得到答案:-3 22 09 31 ???

    也就是说,我们6629在这个时间上加上几秒钟,我们得到-2 0 0 0了,然后会有更多172800的,嗯,我们得到0 0 0 0了,就像这个想法有一个地方一样。

    ps 1 0 0 0 - t,反而0 23 59 59更简单。你只需要23 - hours, 59 - minutes, 59 - seconds,它就会起作用,因为t < 86400

    • 1

相关问题

  • 编译器和模板处理

  • 指针。找到最小数量

  • C++,关于枚举类对象初始化的问题

  • 函数中的二维数组

  • 无法使用默认构造函数创建类对象

  • C++ 和循环依赖

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    表格填充不起作用

    • 2 个回答
  • Marko Smith

    提示 50/50,有两个,其中一个是正确的

    • 1 个回答
  • Marko Smith

    在 PyQt5 中停止进程

    • 1 个回答
  • Marko Smith

    我的脚本不工作

    • 1 个回答
  • Marko Smith

    在文本文件中写入和读取列表

    • 2 个回答
  • Marko Smith

    如何像屏幕截图中那样并排排列这些块?

    • 1 个回答
  • Marko Smith

    确定文本文件中每一行的字符数

    • 2 个回答
  • Marko Smith

    将接口对象传递给 JAVA 构造函数

    • 1 个回答
  • Marko Smith

    正确更新数据库中的数据

    • 1 个回答
  • Marko Smith

    Python解析不是css

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5