在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. Canvas控件之CanvasGroup

    Canvas Group可以用来控制一组不需要个别控制的UI元素的某些方面,CanvasGroup的属性会影响他所有children的GameObject 其中有四个选项: -Alpha:这个选项很多 ...

  2. ioncube

    FileRun多功能的VPS文件管理器使用ioncube加密的 ioncube通过将代码编译成字节码,使PHP源代码免受他人监控.剽窃以及改动 ioncube提供了一个安装的向导程序 下载地址http ...

  3. 基于thinkphp的API日志

    1.thinkphp日志 thinkphp的日志处理工作是由系统自动进行的 在开启日志记录的情况下,会记录下允许的日志级别的所有日志信息 系统的日志记录由核心的Think\Log类及其驱动完成,提供了 ...

  4. mysql覆盖索引(屌的狠,提高速度)

    话说有这么一个表: CREATE TABLE `user_group` ( `id` int(11) NOT NULL auto_increment, `uid` int(11) NOT NULL, ...

  5. Vim终极指南:所思即所得

    https://blog.csdn.net/dc_726/article/details/78981756

  6. Hibernate_day02讲义_使用Hibernate完成CRM客户管理中查询所有客户的操作

  7. Dubbo -- 系统学习 笔记 -- 示例 -- 只注册

    Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 只注册 问题 如果有两个镜像环境,两个注册中心,有一个服务只在其中一个注册中心有部 ...

  8. git push 问题汇总

    Q:git push时卡死 这个问题找的快要放弃的时候... A: git config --global http.postBuffer [via] Q:git push 报错 Counting o ...

  9. PostgreSQL存储过程(5)-异常错误处理

    1. 异常错误处理 在PL/pgSQL函数中,如果没有异常捕获,函数会在发生错误时直接退出,与其相关的事物也会随之回滚.我们可以通过使用带有EXCEPTION子句的BEGIN块来捕获异常并使其从中恢复 ...

  10. Linux 添用户报错:useradd:警告:此主目录已经存在

    建立mysql用户.组 groupadd mysql useradd -g mysql mysql 然后删除 userdel mysql 再添用户和组加时,提示: 解决方法:删除用户不用userdel ...