如何在UNIX上使用C日期和时间函数?
Jon Skeet谈到了2009年伦敦DevDays编程日期和时间的复杂性.
您能否介绍一下UNIX上的ANSI C日期/时间函数,并指出在使用日期和时间时我还应该考虑的一些更深层次的问题?
术语
日期/时间可以采用两种格式: >日历时间(a.k.a.simpletime) – 时间作为绝对值,通常是一些基准时间,通常称为协调世界时 数据类型 日期/时间函数和类型在time.h头文件中声明. 时间可以存储为整数或结构的实例: >作为使用time_t算术类型的数字 – 将日历时间存储为自UNIX纪元1970年1月1日00:00:00以来经过的秒数 tm_hour tm_min tm_isdst 上面的tm_isdst属性用于指示夏令时(DST).如果值为正,则为DST,如果值为0,则不是DST. 程序打印当前的协调世界时 #include <stdio.h> #include <time.h> int main ( int argc,char *argv[] ) { time_t now; now = time ( NULL ); printf ( "It’s %ld seconds since January 1,1970 00:00:00",(long) now ); return 0; } 在上面的程序中,函数time读取UNIX系统时间,从1970年1月1日00:00:00(UNIX纪元)减去该值,并以秒为单位返回其结果. 程序打印当前本地时间 #include <stdio.h> #include <time.h> int main ( int argc,char *argv[] ) { time_t now; struct tm *lcltime; now = time ( NULL ); lcltime = localtime ( &now ); printf ( "The time is %d:%dn",lcltime->tm_hour,lcltime->tm_min ); return 0; } 在上面的程序中,函数localtime将从UNIX纪元开始的经过时间(以秒为单位)转换为细分时间. localtime读取UNIX环境TZ(通过调用tzset函数)返回相对于时区的时间并设置tm_isdst属性. UNIX中TZ变量的典型设置(使用bash)如下: export TZ=GMT 要么 export TZ=US/Eastern 程序打印当前格式化的格林威治标准时间 #include <stdio.h> #include <time.h> int main ( int argc,char *argv[] ) { time_t now; struct tm *gmt; char formatted_gmt [50]; now = time ( NULL ); gmt = gmtime ( &now ); strftime ( formatted_gmt,sizeof(formatted_gmt),"%I:%M %p",gmt ); printf ( "The time is %sn",formatted_gmt ); return 0; } 在上面的程序中,函数strftime提供了日期的专门格式. 其他需要考虑的问题 > Leap seconds (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |