C++如何使用strftime()将用户输入的日期转换为指定格式
解决方案
问题核心原因
你当前的代码完全没有解析传入的date参数,直接调用time(&rawtime)获取了当前系统时间,后续localtime生成的时间结构体也只对应当前时间,所以传入的日期参数没有生效。
调整思路
- 首先解析输入的日期字符串,兼容
/和-两种分隔符,拆分出日、月、年三个字段 - 手动初始化
tm结构体,注意tm结构体的两个特殊规则:tm_year存储的是距1900年的年数,比如2003年要赋值为2003 - 1900tm_mon存储的是0~11的月份值,12月对应11
- 把解析好的字段填充到
tm结构体后,再调用strftime格式化输出即可
修改后的完整代码
#include <iostream> #include <string> #include <stdio.h> #include <time.h> using namespace std; int Fdate(string date){ struct tm timeinfo = {0}; // 初始化空的时间结构体 char buffer [80]; char sep; // 存储分隔符是/还是- // 识别分隔符类型 if (date.find('/') != string::npos) { sep = '/'; } else { sep = '-'; } // 按分隔符拆分日期,填入tm结构体,适配示例的 日/月/年 输入格式 sscanf(date.c_str(), "%d%c%d%c%d", &timeinfo.tm_mday, &sep, &timeinfo.tm_mon, &sep, &timeinfo.tm_year); // 修正为tm结构体要求的格式 timeinfo.tm_year -= 1900; timeinfo.tm_mon -= 1; // 其他字段初始化避免异常 timeinfo.tm_hour = 0; timeinfo.tm_min = 0; timeinfo.tm_sec = 0; timeinfo.tm_isdst = -1; // 自动判断夏令时 // 格式化输出目标格式 strftime (buffer,80,"%B %d %Y", &timeinfo); puts(buffer); return 0; } int main(){ // 测试两种格式的输入 string date1 = "10/12/2003"; Fdate(date1); // 输出 December 10 2003 string date2 = "10-12-2003"; Fdate(date2); // 输出 December 10 2003 return 0; }
注意事项
- 如果你的输入格式是月/日/年而非示例的日/月/年,只需要把
sscanf对应的赋值顺序调换,改成&timeinfo.tm_mon, &sep, &timeinfo.tm_mday, &sep, &timeinfo.tm_year即可 - 如果需要更严谨的日期合法性校验,可以额外添加判断逻辑,比如校验月份范围、日期是否超出对应月份的最大天数等
内容的提问来源于stack exchange,提问作者Asser Moemen
相关产品推荐
相关产品推荐

