linux下tm未初始化导致的时间异常

在Linux环境中,使用struct tm从字符串解析时间时,必须先进行初始化。未初始化可能导致时间值异常,从而引起程序错误。示例代码演示了正确初始化struct tm的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在linux下,若想使用 struct tm 从一个字符串中获取时刻秒数,则必须初始化。
下面的示例代码,在服务器中运行时,tmTime 的值会出现不为1595410483 的情况,导致程序处理出错。

	struct tm when;
    time_t tmTime = 0;
    std::string strTime = "2020-07-22 17:34:43";
    sscanf(strTime.data(), "%d-%d-%d %d:%d:%d", &when.tm_year, &when.tm_mon, &when.tm_mday, &when.tm_hour, &when.tm_min, &when.tm_sec);
    when.tm_mon -= 1;
    when.tm_year -= 1900;
    tmTime = mktime(&when);

应改为下列示例

	struct tm when;
    time_t tmTime = 0;
    localtime_r(&tmTime,&when);
    std::string strTime = "2020-07-22 17:34:43";
    sscanf(strTime.data(), "%d-%d-%d %d:%d:%d", &when.tm_year, &when.tm_mon, &when.tm_mday, &when.tm_hour, &when.tm_min, &when.tm_sec);
    when.tm_mon -= 1;
    when.tm_year -= 1900;
    tmTime = mktime(&when);
TM1637是一种七段数码管和两个LED指示灯的驱动模块,常用于数字显示应用中。初始化TM1637模块通常涉及以下几个步骤: 1. **连接硬件**:将TM1637的数据线连接到微控制器的I/O口(如Arduino的D4或D5),地址线连接到另一个I/O口(如D7),使能端(EN)通常接地。 2. **设置模式**:通过数据线发送特定命令码,设定TM1637的工作模式。例如,可以先发送0x80(四位共阳极数码管)或0xC0(四位共阴极数码管)命令,然后0x70(开启对比度)调整亮度。 3. **设置数码管位**:通过数据线逐位设置数码管的内容,最高位对应最低的LED(如果数码管为BCD编码,需要额外处理每一位)。 4. **显示清除**:在显示前,可以发送一个0x00命令来清除现有的显示内容。 5. **设置单片机频率**:确定主控芯片的定时器频率,因为TM1637的工作速度依赖于这个频率,以便计算脉冲宽度来精确控制显示。 以下是一个简单的TM1637初始化示例(以Arduino为例): ```c++ void setup() { // TM1637初始化 pinMode(D4, OUTPUT); // 数据线 pinMode(D7, OUTPUT); // 地址线 digitalWrite(D7, HIGH); // 设置为七段数码管模式 delayMicroseconds(1); digitalWrite(D7, LOW); // 显示清除 writeDigit(0x00, 0); // 0x00 清除显示 } void writeDigit(uint8_t data, uint8_t segs) { for (uint8_t i = 0; i < 4; ++i) { // 四位数码管 if (segs & (1 << i)) { shiftOut(D4, D7, MSBFIRST, data >> i & 0x0F); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值