Q题 - 前天是哪天

解题思路:

  1. 日期>=3, -2即可, 下面讨论日期为1/2的情况
  2. 月份为1时年份-1, 下面讨论月份不为1的情况
  3. 月份不为3时根据具体每月最大天数计算, 月份为3时判断闰年,按对应的2月最大日期计算

实现代码:

#include<bits/stdc++.h>
using namespace std;

void beforeYesterday(string& s){
    // 存在“2038年问题”, 未使用
    stringstream ss(s);
    tm tm={};
    ss>>get_time(&tm, "%Y-%m-%d");
    time_t current_time_t = mktime(&tm);
    auto current=chrono::system_clock::from_time_t(current_time_t);
    auto ans=current-chrono::hours(48);
    time_t ans_time_t=chrono::system_clock::to_time_t(ans);
    std::tm* ans_tm = localtime(&ans_time_t);
    char buffer[11];
    strftime(buffer, sizeof(buffer), "%Y-%m-%d", ans_tm);
    string sss = string(buffer);
    cout<<sss;
}

// 闰年判断
bool isLeapYear(int y){
    return (y%4==0 && y%100 || y%400==0);
}

int main(){
    string s;
    cin>>s;
    stringstream ss(s);
    int year, month, day;
    char t;
    int days[]={0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    ss>> year>> t>> month>> t>> day;
    if(day>=3){
        day-=2;
    }else{
        if(month==1){
            year--;
            month=12;
        }else{
            month--;
        }
        if(month==2){   // 上个月是2月
            if(isLeapYear(year)){
                day=29-(2-day);
            }else{
                day=28-(2-day);
            }
        }else{
            day=days[month]-(2-day);
        }
    }
    cout<<year<<t;
    if(month<10){
        cout<<'0';
    }
    cout<<month;
    cout<<'-';
    if(day<10){
        cout<<'0';
    }
    cout<<day;
    return 0;
}