You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++如何使用strftime()将用户输入的日期转换为指定格式

解决方案

问题核心原因

你当前的代码完全没有解析传入的date参数,直接调用time(&rawtime)获取了当前系统时间,后续localtime生成的时间结构体也只对应当前时间,所以传入的日期参数没有生效。

调整思路

  • 首先解析输入的日期字符串,兼容/和-两种分隔符,拆分出日、月、年三个字段
  • 手动初始化tm结构体,注意tm结构体的两个特殊规则:
    • tm_year存储的是距1900年的年数,比如2003年要赋值为2003 - 1900
    • tm_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 17:15:04