【问题标题】:timestamp of last Monday in C++C ++中上周一的时间戳
【发布时间】:2019-01-22 01:36:00
【问题描述】:

我需要使用 C++ 在本地时区获取上周一开始 (00:00) 的时间戳 (time_t)。有什么简单的方法可以只使用标准 C++ 而不使用第三方库吗?

【问题讨论】:

  • 要小心,在这里谈论 C/C++(即不仅仅是两种不同语言中的一种)会避开一些通常有帮助的人。
  • 您想要C 还是C++ 解决方案?
  • 这个问题没有显示任何研究工作。目前尚不清楚您所说的“上周一”究竟是什么意思。
  • 这取决于你对“简单”的定义。我将从tm 类型开始。最棘手的部分可能是弄清楚“上周一”的日期。 (如果星期一,“最后一个”是这个还是一周前的那个?)
  • 如果你使用别人的库,有一个简单的方法。

标签: c++ datetime time


【解决方案1】:

为什么没有第三方库?使用Howard Hinnant's header only date library 会更容易,它应该在未来的标准中可用:

#include "date.h"
#include <iostream>

int main()
{
    using namespace date;
    using namespace std::chrono;
    //auto now = sys_days(2018_y/August/12);
    auto now = floor<days>(system_clock::now());
    date::weekday day = weekday{ now };
    now -= day - Monday;
    std::cout << year_month_day(now) << "\n";
    time_t time = now.time_since_epoch().count();
    std::cout << time << "\n";
}

【讨论】:

  • 非常感谢!其实我只是不想在我的小程序中添加第三方库,所以我只想有标准库。但是如果没有其他简单的方法,我会使用这个库。
  • 始终使用第三方库,让其他人完成艰苦的工作并修复所有错误,专注于实现您的功能。少写代码,少犯错误
  • 不错的答案!但为了完全透明,这会以 UTC 计算上周一的开始时间,而不是计算机的本地时区。为此,您需要“tz.h”。将system_clock::now() 转换为zoned_time,使用current_zone() 之前的地板转换为days。然后继续使用相同的算法。此外,如果当天是星期一,并且您更喜欢一周前,而不是同一天,请在开始算法之前从本地 now 中减去一天。从问题中不清楚是否需要最后一次修改。
【解决方案2】:

这是我自己对此任务的快速解决方案,我认为可以改进它以适应一周中的任何一天......

time_t get_monday_timestamp(time_t time)                             
{                                                                           
    tm* timeinfo = localtime(&time);                                        
    int wday=timeinfo->tm_wday;                                             
    int hour=timeinfo->tm_hour;                                             
    int min=timeinfo->tm_min;                                               
    int sec=timeinfo->tm_sec;                                               

    time_t SECONDS_IN_DAY = 60 * 60 * 24;                                   

    //monday should be 0 and sunday 6                                       
    wday--;                                                                 
    if(wday == -1)                                                          
    {                                                                       
        wday = 6;                                                           
    }                                                                       

    time -= wday * SECONDS_IN_DAY;                                          
    time -= (sec + 60 * min + 60 * 60 * hour);                              

    return time;                                                            
}                   

【讨论】:

    猜你喜欢
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    相关资源
    最近更新 更多