在minix2.0源代码中,有相当经典的时间转换函数实现(src\ src\ lib\ ansi\ asctime.c),今天我们就来分析一下asctime.c中的源码

首先引入几个相关的头文件:

1、time.h 主要的结构体与相关定义:

struct tm {
int tm_sec; /* 分钟后面的秒[0, 59] */
int tm_min; /* 小时后面的分钟[0, 59] */
int tm_hour; /* 距离凌晨00:00点的小时数[0, 23] */
int tm_mday; /* 月中的某一天[1, 31] */
int tm_mon; /* 某一个月份[0, 11] */
int tm_year; /* 与1900相隔的年数 */
int tm_wday; /* 离星期日的天数 [0, 6] */
int tm_yday; /* 从一月开始的天数 [0, 365] */
int tm_isdst; /* Daylight Saving Time flag */
};
char *asctime(const struct tm *_timeptr)

2、loc_time.h

#define    YEAR0        1900        /*第一年*/
#define EPOCH_YR 1970 /* EPOCH = Jan 1 1970 00:00:00 */
#define SECS_DAY (24L * 60L * 60L)
#define LEAPYEAR(year) (!((year) % 4) && (((year) % 100) || !((year) % 400)))
#define YEARSIZE(year) (LEAPYEAR(year) ? 366 : 365)
#define FIRSTSUNDAY(timp) (((timp)->tm_yday - (timp)->tm_wday + 420) % 7)
#define FIRSTDAYOF(timp) (((timp)->tm_wday - (timp)->tm_yday + 420) % 7)
#define TIME_MAX ULONG_MAX
#define ABB_LEN 3 extern const int _ytab[][];
extern const char *_days[];
extern const char *_months[]; void _tzset(void);
unsigned _dstget(struct tm *timep); extern long _timezone;
extern long _dst_off;
extern int _daylight;
extern char *_tzname[];

3、asctime.c

#include    <string.h>
#include <time.h>
#include "loc_time.h" #define DATE_STR "??? ??? ?? ??:??:?? ????\n" //时间格式 static char * two_digits(register char *pb, int i, int nospace)
{
//将两位数字转化为字符形式并存储在pb所指向的地址空间中
*pb = (i / ) % + '';
if (!nospace && *pb == '') *pb = ' ';
pb++;
*pb++ = (i % ) + '';
return ++pb;
} static char * four_digits(register char *pb, int i)
{
//将四位数字转化为字符形式并存储在pb所指向的地址空间中
i %= ;
*pb++ = (i / ) + '';
i %= ;
*pb++ = (i / ) + '';
i %= ;
*pb++ = (i / ) + '';
*pb++ = (i % ) + '';
return ++pb;
} char *asctime(const struct tm *timeptr) //把timeptr指向的tm结构体中储存的时间转换为字符串格式返回。
{ // 格式为:Www Mmm dd hh:mm:ss yyyy。
//其中Www为星期;Mmm为月份;dd为日;hh为时;mm为分;ss为秒;yyyy为年份。
static char buf[];
register char *pb = buf;
register const char *ps;
register int n; strcpy(pb, DATE_STR); //对buf进行标准格式初始化: pb-> ??? ??? ?? ??:??:?? ????\n
ps = _days[timeptr->tm_wday]; //extern const char *_days[];
n = ABB_LEN; //#define ABB_LEN 3
while(--n >= ) *pb++ = *ps++;
pb++;
ps = _months[timeptr->tm_mon];
n = ABB_LEN;
while(--n >= ) *pb++ = *ps++;
pb++;
pb = two_digits(
two_digits(
two_digits(two_digits(pb, timeptr->tm_mday, )
, timeptr->tm_hour, )
, timeptr->tm_min, )
, timeptr->tm_sec, ); four_digits(pb, timeptr->tm_year + );
return buf;
}

minix中时间转换的实现(asctime.c)的更多相关文章

  1. ie浏览器中时间转换

    var begintime = $("#start").val(); var lastLoginTimeStart =new Date(begintime).getTime();/ ...

  2. vue中插值表达式中时间转换yyyy-MM-dd HH:mm:ss

    vue插值表达式中将时间转换两种方式:一.定义方法 <div id="app">当前实时时间:{{dateFormat(date)}}</div> //时间 ...

  3. php中时间转换函数

    date("Y-m-d H:i",$unixtime)  1.php中获得今天零点的时间戳 要获得零点的unix时间戳,可以使用 $todaytime=strtotime(“tod ...

  4. C++中时间转换

    所需头文件 #include <chrono> #include <time.h> auto now = std::chrono::system_clock::now(); s ...

  5. python中时间格式

    问题:通过MySQLdb查询datetime字段,然后通过浏览器显示出来,得到的格式是:         'Thu, 19 Feb 2009 16:00:07 GMT'   (http呈现出来的格式) ...

  6. js中的时间转换—毫秒转换成日期时间

    转自:http://www.javascript100.com/?p=181 前几天,在项目中遇到js时间增加问题,要将js毫秒时间转换成日期时间 var oldTime = (new Date(&q ...

  7. sql点滴42—mysql中的时间转换

    原文:sql点滴42-mysql中的时间转换 UNIX时间戳转换为日期用函数: FROM_UNIXTIME() select FROM_UNIXTIME(1156219870); 日期转换为UNIX时 ...

  8. JAVA中时间格式(SimpleDateFormat)和数字格式(DecimalFormat)转换详解(转)

    时间格式转换SimpleDateFormat: //定义日期的格式 SimpleDateFormat format =new SimpleDateFormat("yyMMdd"); ...

  9. python中时间的转换和使用datetime

    模块 一个完整大型的python程序是由模块和包的形式组织起来的,可见模块在python中的重要性.模块是一种组织型式,它许多有关联(关系)的代码组织放到单独的独立文件中.简单的说,可以把模块理解为一 ...

随机推荐

  1. Thinkphp5笔记四:设置模板路径

    默认的模板路径在模块/view文件里面.如果你觉得这样不太方便管理,想要把他设置Template目录下,可以这样做. 模板参数 ,能够影响的它参数,是当前模块下config.php template- ...

  2. scala中获取Map中key和value的方法

    val scores=Map("Alice"->10,"Bob"->3,"Cindy"->8) // 获取所有的key v ...

  3. Hibernate_day03讲义_使用Hibernate完成多对多的关系映射并操作

  4. my-small.ini、my-medium.ini、my-large.ini、my-huge.ini文件的作用

    安装完mysql之后或者是下载的免安装版解压之后,默认是没有my.ini文件的.但是,有几个类似的文件,如my-small.ini.my-medium.ini.my-large.ini.my-huge ...

  5. IDEA maven项目下测试mybatis例子,使用mappper class或package引入mapper映射文件,总是报错Invalid bound statement(所有配置完全正确)

    困扰几个小时,终于查到解决办法及原因(可以直接到最后看解决方案) 环境就是用IDEA搭建的maven项目,主要jar包引入配置如下 <dependencies> <dependenc ...

  6. MySQL复制搭建

    1. 原理 参考<涂抹MySQL  跟着三思一步一步学MySQL >这本书. 2.环境背景 操作系统 :CentOS 6.5 数据库版本:MySQL 5.6 主库A:192.168.1.2 ...

  7. 使用CountDownLatch模拟高并发场景

    import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java ...

  8. Lua协程-测试3

    print("Lua 协程测试3") -- 实现消费者-生产者关系(生产一个就消费一个) count = -- 生产总数 -- 生产者 local newProductorCo = ...

  9. SaltStack 安装及配置认证

    一.SaltStack 安装 SaltStack 是基于 Python 开发的,也是基于 C/S 架构,通过服务端 ( master ) 控制多台客户端 ( minion ) 实现批量操作这里我们使用 ...

  10. Unity Shader 设置纹理采样tex2D过滤方式

    双击红色框区域