strptime()和strftime()
一、功能实现
1、函数功能
名称
|
功能
|
其他
|
strptime
|
字符串转时间
|
可用sscanf()自行实现(见:本文)
|
strftime
|
时间转字符串
|
可用sprintf()自行实现(见:Linux
时间转字符串(格式化时间))
|
2、举例实现
见:
linux 下时间字符串和time_t类型之间的相互转化
linux中常用时间和字符串之间相互转化
二、自行实现strptime()功能
1、背景介绍:当调用c标准库中的strptime()实现字符串转时间的功能时,编译出的ELF文件a.out,在Linux服务器中能够正常执行,但在开发板上显示乱码。
实现:
![](/attachment/201710/31/31387290_1509455913R3yd.png)
结果_Linux服务器:
![](/attachment/201710/31/31387290_15094559918phP.png)
结果_开发板:
![](/attachment/201710/31/31387290_15094560063307.png)
使用readelf工具查看两个ELF文件所依赖的c库:
Linux服务器上a.out,所链接的库是libc.so.6,是glibc库。
![](/attachment/201710/31/31387290_1509456126vlkN.png)
单板a.out,所链接的库是libc.so.1,是libc库。
![](/attachment/201710/31/31387290_1509456206rRK7.png)
glibc 和 libc 都是 Linux 下的 C 函数库。glibc本身是GNU旗下的C标准库,后来逐渐成为了Linux的标准c库,而Linux下原来的标准c库Linux libc逐渐不再被维护。而glibc无疑是用得最多的。glibc在/lib目录下的.so文件为libc.so.6。
所以,我个人猜测是老的libc.so.1中strptime()的实现更现在不一样,当前这种写法不对,具体就要去看老库中的实现了。而被人也懒得去找老库中的实现,以及为什么会出现同一份代码,不同结果的问题。
2、自行实现strptime()
首先,告诉你个诀窍,当你无从下手的时候,你可以在现有代码grep一把作为参考。如:grep -rn "strptime(" 或 在OPENWRT平台中用 grep -rn "#ifdef HAVE_STRPTIME" 搜索的更全。
但是,我仔细看了下,在我的OPENWRT平台中有六七处自行实现strptime()功能的模块,但是都有缺陷,如:.tm_yday或.tm_wday未赋值,随不影响最终结果,但是若中间打印后发现如week是错误的。以下是我实现的代码:
![](/attachment/201710/31/31387290_1509456439Zltn.png)
在开发板上的执行结果:
阅读(9180) | 评论(0) | 转发(0) |