Q题 - 前天是哪天
解题思路:
- 日期>=3, -2即可, 下面讨论日期为1/2的情况
- 月份为1时年份-1, 下面讨论月份不为1的情况
- 月份不为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;
}