C/C++ let __DATE__ format to “YYYY-MM-DD“

C/C++ let DATE format to “YYYY-MM-DD”

code:

#include <iostream>
#include <string>

class compileDate {

// 静态函数,用来格式化并返回编译日期
static std::string formatCompileDate() {
    // 编译时的日期,格式为 "MMM DD YYYY"
    const std::string date = __DATE__;

    // 定义月份的映射,使用数组而非std::map
    struct MonthMap {
        const char* short_name;
        const char* num;
    };
    static const MonthMap months[] = {
        {"Jan", "01"}, {"Feb", "02"}, {"Mar", "03"}, {"Apr", "04"},
        {"May", "05"}, {"Jun", "06"}, {"Jul", "07"}, {"Aug", "08"},
        {"Sep", "09"}, {"Oct", "10"}, {"Nov", "11"}, {"Dec", "12"}
    };

    // 解析 `__DATE__`
    std::string month = date.substr(0, 3);  // 月份的前三个字母
    std::string day = date.substr(4, 2);    // 日期
    std::string year = date.substr(7, 4);   // 年份

    // 移除日期前的空格
    if (day[0] == ' ') {
        day = day.substr(1);
    }

    // 查找月份的数字表示
    const char* monthNum = "00";  // 默认为无效月份
    for (int i = 0; i < 12; ++i) {
        if (month == months[i].short_name) {
            monthNum = months[i].num;
            break;
        }
    }

    // 格式化输出为 YYYY-MM-DD HH:MM:SS
    return year + "-" + monthNum + "-" + (day.size() == 1 ? "0" + day : day) + " " + __TIME__;
}
public:
// 返回编译日期并只执行一次
static const std::string& formated() {
    static const std::string formattedDate = formatCompileDate();
    return formattedDate;
}
};

int main() {
    std::cout << "Compilation date : " << compileDate::formated()<< std::endl;
    return 0;
}

Usage:

[root@VM-24-13-centos cpp]# g++ __DATE__.cpp
[root@VM-24-13-centos cpp]# ./a.out
Compilation date : 2024-09-10 22:26:13
[root@VM-24-13-centos cpp]#
### 将毫秒级时间戳转换为年月日格式 要将1741915401000这样的毫秒级时间戳转换为年月日格式,可以通过多种方法实现。以下是几种常见的技术栈下的解决方案。 #### 方法一:C/C++ 实现 在C/C++中,可以利用标准库中的`time.h`头文件来完成这一操作。具体来说,先将毫秒级时间戳除以1000得到秒级时间戳,再通过`gmtime`或`localtime`将其转化为结构体形式的时间数据,最后提取所需的年、月、日部分[^1]。 ```cpp #include <iostream> #include <ctime> int main() { long long timestamp_ms = 1741915401000; time_t timestamp_s = timestamp_ms / 1000; // 转换为秒级时间戳 struct tm* local_time = localtime(&timestamp_s); int year = local_time->tm_year + 1900; // 年份从1900年开始计数 int month = local_time->tm_mon + 1; // 月份从0开始计数 int day = local_time->tm_mday; std::cout << "Date: " << year << "-" << month << "-" << day << std::endl; } ``` #### 方法二:MySQL 中的实现 如果是在数据库查询场景下处理时间戳,则可以直接使用SQL语句配合内置函数完成转换工作。例如,在MySQL里有专门用于格式化日期显示效果的`DATE_FORMAT()`功能[^2]: ```sql SELECT DATE_FORMAT(FROM_UNIXTIME(UNIX_TIMESTAMP('1970-01-01') + FLOOR(1741915401000/1000)), '%Y-%m-%d'); ``` 这里需要注意的是原始输入单位应调整至秒钟级别后再参与运算过程。 #### 方法三:HTML/Javascript 前端实现 对于Web开发环境而言,JavaScript提供了强大的Date对象支持各种复杂的日期计算需求。下面展示了一种简单易懂的方式来进行相应变换[^3]: ```javascript function formatDate(timestampMs){ let dateObj=new Date(Number(timestampMs)); const options={year:'numeric',month:'2-digit',day:'2-digit'}; return new Intl.DateTimeFormat('en-US',options).format(dateObj); } console.log(formatDate(1741915401000)); // 输出类似于 "MM/DD/YYYY" ``` 或者采用正则表达式替换法手动构建目标样式字符串: ```javascript var ts=1741915401000; var d=new Date(ts); document.write(d.getFullYear()+"-"+((d.getMonth()+1)<10?"0":"")+(d.getMonth()+1)+"-"+(d.getDate()<10?"0":"")+d.getDate()); ``` 以上就是不同平台环境下针对同一问题所提供的解答方案概览。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值