- 浏览: 142471 次
文章分类
最新评论
UNIX 内核提供的基本时间服务是计算自协调世界时(Coordinated Universal Time, UTC)公元 1970 年 1 月 1 日 00:00:00 这一特定时间以来经过的秒数(以数据类型 time_t 表示),通常称之为为日历时间。日历时间包括时间和日期,可自动进行变换,如变换到夏令时。
time 函数可用于返回当前的时间和日期。
时间值作为函数值返回。如果参数非空,则时间值也存放在由 calptr 指向的单元内。
POSXI.1 的实时扩展增加了对多个系统时钟的支持。时钟通过 clockid_t 类型进行标识,标准的值如下表所示。
下面几个函数可以用来操作时钟。
clock_gettime 函数可用于获取指定时钟的时间,返回的时间在 timespec 结构中。当 clock_id 设置为 CLOCK_REALTIME 时,clock_gettime 就提供了类似 time 的功能,只是可能拥有更高的精度。
clock_getres 函数把参数 tsp 指向的 timespec 结构初始化为与 clock_id 参数对应的时钟精度。例如,如果精度为 1 毫秒,则 tv_sec 字段就是 0,tv_nsec 字段就是 1000000。
clock_settime 函数可对特定的时钟设置时间,这需要适当的特权,而且有些时钟是不能修改的(历史上,System V 派生的系统是调用 stime 函数来设置系统时间,而 BSD 派生的系统是调用 settimeofday 函数来设置系统时间)。
gettimeofday 函数已被 SUSv4 指定为弃用,但一些程序仍然在使用,因为它提供了比 time 函数更高的精度(可到微秒级)。tzp 参数的唯一合法值是 NULL,其他值将产生不确定的结果。该函数将当前时间秒数存放在 tp 指向的 timeval 结构中,而该结构将当前时间表示为秒和微秒。
一旦取得这种从上述特定时间经过的秒数的整型时间值后,通常需要调用函数将其转换为分解的时间结构,然后调用另一个函数生成可读的时间和日期。
这里的秒可以超过 59 的理由是可以表示润秒(Single UNIX Specification 的以前版本允许双润秒,所以 tm_sec 的有效范围是 0~61)。除了月日字段,其他字段的值都以 0 开始。如果夏令时生效,则夏令时标志为正;如果为非夏令时时间,则该标志值为 0;如果此信息不可用,则其值为负。
localtime 和 gmtime 函数将日历时间转换成分解的时间,并存放在 tm 结构中。它们的区别是:localtime 转换成本地时间,而 gmtime 转换成协调统一时间。
mktime 函数将本地时间转换成 time_t 值。
strftime 函数可通过可用的多个参数来定制产生的字符串。strftime_l 允许将区域指定为参数,strftime 使用通过 TZ 环境变量指定的区域。除此之外,strftime 和 strftime_l 是相同的(两个较早的函数 asctime 和 ctime 能用于产生一个 26 字节的可打印的字符串,类似于 date 命令的默认输出,但它们已因缓冲区溢出问题而被标记为弃用了)。
tmptr 参数是要格式化的时间值。格式化结果存在一个长度为 maxsize 个字符的 buf 数组中。
format 参数控制时间值的格式,其中除转换说明以外的字符都按原样输出。以下列出了 37 种 ISO C 规定的转换说明。
其中可能需要略作解释的是 %U、%V 和 %W。%U 是相应日期在该年中所属周数,包含该年中第一个星期日的周是第一周。%W 也是相应日期在该年中所属的周数,不同的是包含第一个星期一的周为第一周。%V 说明符则是如果包含了 1 月 1 日的那一周包含了新一年的 4 天以上,那么该周是一年中的第一周;否则就被认为是上一年的最后一周。在这两种情况下,周一都被视作每周的第一天。
strftime 同 printf 对某些转换说明支持修饰符,可以使用 E 和 O 修饰符产生本地支持的另一种格式。
strptime 函数是 strftime 的相反版本,把字符串时间转换成分解时间。format 参数给出了 buf 参数指向的缓冲区内的字符串的格式。
下面这个程序简单演示了 strftime 函数的使用。
运行结果如下。
下图说明了各种时间函数之间的关系。
图中的 localtime、mktime 和 strftime 三个函数都受到环境变量 TZ 的影响。如果定义了 TZ,则这些函数将使用其值代替默认时区。如果定义为空串(即 TZ=),则使用 UTC。TZ 的值常常类似于 TZ=EST5EDT。
time 函数可用于返回当前的时间和日期。
#include <time.h> time_t time(time_t *calptr); /* 返回值:若成功,返回时间值;否则,返回 -1 */
时间值作为函数值返回。如果参数非空,则时间值也存放在由 calptr 指向的单元内。
POSXI.1 的实时扩展增加了对多个系统时钟的支持。时钟通过 clockid_t 类型进行标识,标准的值如下表所示。
下面几个函数可以用来操作时钟。
#include <time.h> int clock_gettime(clockid_t clock_id, struct timespec *tsp); int clock_getres(clockid_t clock_id, struct timespec *tsp); int clock_settime(clockid_t clock_id, const struct timespec *tsp); /* 返回值:若成功,都返回 0;否则,都返回 -1 */ int gettimeofday(struct timeval *restrict tp, void *restrict tzp); /* 返回值:总是返回 0 */ struct timespec{ time_t tv_sec; long tv_nsec; }; struct timeval{ time_t tv_sec; // seconds long tv_usec; // microseconds };
clock_gettime 函数可用于获取指定时钟的时间,返回的时间在 timespec 结构中。当 clock_id 设置为 CLOCK_REALTIME 时,clock_gettime 就提供了类似 time 的功能,只是可能拥有更高的精度。
clock_getres 函数把参数 tsp 指向的 timespec 结构初始化为与 clock_id 参数对应的时钟精度。例如,如果精度为 1 毫秒,则 tv_sec 字段就是 0,tv_nsec 字段就是 1000000。
clock_settime 函数可对特定的时钟设置时间,这需要适当的特权,而且有些时钟是不能修改的(历史上,System V 派生的系统是调用 stime 函数来设置系统时间,而 BSD 派生的系统是调用 settimeofday 函数来设置系统时间)。
gettimeofday 函数已被 SUSv4 指定为弃用,但一些程序仍然在使用,因为它提供了比 time 函数更高的精度(可到微秒级)。tzp 参数的唯一合法值是 NULL,其他值将产生不确定的结果。该函数将当前时间秒数存放在 tp 指向的 timeval 结构中,而该结构将当前时间表示为秒和微秒。
一旦取得这种从上述特定时间经过的秒数的整型时间值后,通常需要调用函数将其转换为分解的时间结构,然后调用另一个函数生成可读的时间和日期。
#include <time.h> struct tm *gmtime(const time_t *calptr); struct tm *localtime(const time_t *calptr); /* 返回值:若成功,都返回指向分解的 tm 结构的指针;否则,都返回 NULL */ time_t mktime(struct tm *tmptr); /* 返回值:若成功,返回日历时间;否则,返回 -1 */ size_t strftime(char *restrict buf, size_t maxsize, const char *restrict format, const struct tm *restrict tmptr); size_t strftime_l(char *restrict buf, size_t maxsize, const char *restrict format, const struct tm *restrict tmptr, locale_t locale); /* 返回值:若有空间,都返回存入数组的字符数;否则,都返回 0 */ char *strptime(const char *restrict buf, const char *restrict format, struct tm *restrict tmptr); /* 返回值:指向上次解析的字符的下一个字符的指针;否则,返回 NULL */ struct tm{ // a broken-down time int tm_sec; // seconds after the minute: [0 - 60] int tm_min; // minutes after the hour: [0 - 59] int tm_hour; // hours after midnight: [0 - 23] int tm_mday; // day of the month: [1 - 31] int tm_mon; // months since January: [0 - 11] int tm_year; // years since 1900 int tm_wday; // days since Sunday: [0 - 6] int tm_yday; // days since January: [0 - 365] int tm_isdst; // daylight saving time flag: <0, 0, >0 };
这里的秒可以超过 59 的理由是可以表示润秒(Single UNIX Specification 的以前版本允许双润秒,所以 tm_sec 的有效范围是 0~61)。除了月日字段,其他字段的值都以 0 开始。如果夏令时生效,则夏令时标志为正;如果为非夏令时时间,则该标志值为 0;如果此信息不可用,则其值为负。
localtime 和 gmtime 函数将日历时间转换成分解的时间,并存放在 tm 结构中。它们的区别是:localtime 转换成本地时间,而 gmtime 转换成协调统一时间。
mktime 函数将本地时间转换成 time_t 值。
strftime 函数可通过可用的多个参数来定制产生的字符串。strftime_l 允许将区域指定为参数,strftime 使用通过 TZ 环境变量指定的区域。除此之外,strftime 和 strftime_l 是相同的(两个较早的函数 asctime 和 ctime 能用于产生一个 26 字节的可打印的字符串,类似于 date 命令的默认输出,但它们已因缓冲区溢出问题而被标记为弃用了)。
tmptr 参数是要格式化的时间值。格式化结果存在一个长度为 maxsize 个字符的 buf 数组中。
format 参数控制时间值的格式,其中除转换说明以外的字符都按原样输出。以下列出了 37 种 ISO C 规定的转换说明。
其中可能需要略作解释的是 %U、%V 和 %W。%U 是相应日期在该年中所属周数,包含该年中第一个星期日的周是第一周。%W 也是相应日期在该年中所属的周数,不同的是包含第一个星期一的周为第一周。%V 说明符则是如果包含了 1 月 1 日的那一周包含了新一年的 4 天以上,那么该周是一年中的第一周;否则就被认为是上一年的最后一周。在这两种情况下,周一都被视作每周的第一天。
strftime 同 printf 对某些转换说明支持修饰符,可以使用 E 和 O 修饰符产生本地支持的另一种格式。
strptime 函数是 strftime 的相反版本,把字符串时间转换成分解时间。format 参数给出了 buf 参数指向的缓冲区内的字符串的格式。
下面这个程序简单演示了 strftime 函数的使用。
#include <stdio.h> #include <stdlib.h> #include <time.h> int main(void){ time_t t; struct tm *tmp; char buf1[16]; char buf2[64]; time(&t); tmp = localtime(&t); if(strftime(buf1, 16, "time and date: %r, %a %b %d, %Y", tmp) == 0) printf("buffer length 16 is too small\n"); else printf("%s\n", buf1); if(strftime(buf2, 64, "time and date: %r, %a %b %d, %Y", tmp) == 0) printf("buffer length 64 is too small\n"); else printf("%s\n", buf2); exit(0); }
运行结果如下。
$ ./strftimeDemo.out buffer length 16 is too small time and date: 00:45:35 AM, Fri Aug 19, 2017
下图说明了各种时间函数之间的关系。
图中的 localtime、mktime 和 strftime 三个函数都受到环境变量 TZ 的影响。如果定义了 TZ,则这些函数将使用其值代替默认时区。如果定义为空串(即 TZ=),则使用 UTC。TZ 的值常常类似于 TZ=EST5EDT。
发表评论
-
打开伪终端设备
2018-07-09 20:50 1252在伪终端概述一节中已对 PTY进行了初步的介绍。尽管 ... -
伪终端概述
2018-06-02 11:05 1550伪终端就是指,一个应用程序看上去像一个终端,但事实上它 ... -
终端窗口大小和 termcap
2018-05-29 22:39 800多数 UNIX 系统都提供了一种跟踪当前终端窗口大小的 ... -
终端规范模式和非规范模式
2018-05-29 00:25 950终端规范模式很简单:发一个读请求,当一行已经输入后,终 ... -
终端标识
2018-05-23 11:18 569尽管控制终端的名字在多数 UNIX 系统上都是 /de ... -
波特率和行控制函数
2018-05-22 07:53 944虽然大多数终端设 ... -
终端属性和选项标志
2018-05-20 07:40 710tcgetattr 和 tcsetattr ... -
终端特殊输入字符
2018-05-17 06:33 815终端支持下表所示的特殊输入字符。 为了更改 ... -
终端 I/O 综述
2018-05-10 07:56 439终端设备可认为是由内核中的终端驱动程序控制的。每个终端 ... -
POSIX 信号量
2018-05-09 00:03 579在XSI IPC通信之信 ... -
XSI IPC 通信之共享存储
2018-04-25 07:18 947在XSI IPC通信之消息队列和XSI IPC通信之信 ... -
XSI IPC通信之信号量
2018-04-17 23:38 617在XSI IPC通信之消 ... -
XSI IPC通信之消息队列
2018-04-15 10:54 497消息队列是消息的链接表,存储在内核中,由消息队列标识符 ... -
XSI IPC 相似特征介绍
2018-02-08 23:48 485有 3 种称作 XSI IPC ... -
IPC 通信之 FIFO
2018-02-06 22:55 421FIFO 也被称为命名管道,未命名的管道只能在两个相关 ... -
IPC 通信之管道
2018-01-30 22:22 389管道是 UNIX 系统 IPC 的最古老但也是最常用的 ... -
readv/writev 函数及存储映射 I/O
2018-01-19 00:57 891readv 和 writev 函数可用于在一次函数调用 ... -
POSIX 异步 I/O
2018-01-16 21:33 455POSIX 异步 I/O 接口为对不同类型的文件进行异 ... -
fcntl 记录锁
2018-01-06 23:48 615记录锁的功能是:当有进程正在读或修改文件的某个部分时, ... -
守护进程惯例
2018-01-06 23:52 439UNIX 系统中,守护进程遵循下列通用惯例。 ...
相关推荐
### C语言函数库第六章(时间和日期函数) 在C语言中,处理时间和日期的功能非常重要,尤其是在需要进行时间戳记录、日期计算或者定时任务等场景。本章节将详细介绍C语言中的几个关键时间与日期处理函数,包括`...
在MySQL数据库系统中,时间和日期函数是用于处理和操作日期和时间数据的重要工具。这些函数使得在SQL查询中获取、格式化或计算日期和时间变得非常便捷。以下是一些主要的时间和日期函数的详细说明: 1. **当前日期...
GO时间和日期函数详解
在C#编程中,日期和时间操作是常见的需求,用于处理和展示各种日期时间相关的数据。DateTime类是C#中处理日期和时间的核心类,它提供了...了解并熟练掌握这些函数和方法对于编写高效、准确的日期时间处理代码至关重要。
ClickHouse是一个开源的列式数据库管理系统,它提供了丰富的时间日期函数来处理和操作时间和日期数据。以下是ClickHouse中常用的时间日期函数的简介: 1. toDate(date_expression):将日期表达式转换为日期类型。...
其中,日期函数是Gbase 8s内置函数中的一部分,主要用于处理和操作日期和时间数据。本文将详细介绍Gbase 8s内置函数中的日期函数,包括SYSDATE、CURRENT、TODAY、LAST_DAY、YEAR、MONTH、DAY、WEEKDAY、QUARTER、ADD...
2.获取上个月最后一天的日期(本月的第一天减去1天) 复制代码 代码如下:last = datetime.date(datetime.date.today().year,datetime.date.today().month,1)-datetime.timedelta(1)print last 3.获取时间差(时间差单位...
在SQL(结构化查询语言)中,时间与日期函数是处理日期和时间数据的重要工具,它们可以帮助我们进行各种时间相关的计算、格式化和提取操作。本文将深入探讨SQL中的主要时间与日期函数,并通过实例来展示其具体用法。...
在MySQL数据库中,时间日期函数是处理与时间相关的数据时不可或缺的一部分。这些函数提供了丰富的功能,可以帮助用户在查询、更新或插入数据时精确地操作日期和时间。下面将详细介绍几个核心的时间日期函数及其应用...
Oracle 自定义日期函数 Oracle 日期处理函数是数据库管理系统中非常重要的一部分,最近看到有人在做 T-SQL 与 PL/SQL 的转化,问了些有关时间函数的处理。在 PL/SQL 中,Oracle 提供了其他的方法来处理日期函数,...
在VB(Visual Basic)编程语言中,日期函数是处理日期和时间值的重要工具。这些函数允许程序员进行日期的计算、格式化以及与日期相关的各种操作。以下是一些关键的VB日期函数及其详细说明: 1. **Date()**:这个...
MYSQL 日期函数大全,供大家一起共同分享学习。
MySQL是世界上最受欢迎的关系型数据库管理系统之一,其在处理日期和时间数据方面提供了丰富的函数和操作。日期和时间函数是MySQL中的重要组成部分,它们允许我们进行日期和时间的计算、格式化以及各种操作,极大地...
SQL Server 提供了多种时间日期函数,帮助开发者快速处理日期和时间相关的操作。下面将对这些函数进行详解,并提供示例。 1. GetDate() 函数 GetDate() 函数用于返回当前系统的日期和时间。语法如下: SELECT ...
了解并熟练掌握这些时间日期函数,能极大地提升你在数据库查询和数据处理中的效率。 例如,以下是一个示例查询,找出所有在2022年1月1日后创建的记录: ```sql SELECT * FROM table_name WHERE created_at > DATE('...
在实际开发中,结合使用Delphi的日期处理函数和SQL的日期时间函数,可以构建出强大的数据处理和分析系统。例如,你可能需要在Delphi程序中获取当前日期,然后将这个日期插入到MSSQL数据库中,或者根据用户输入的日期...
它提供了丰富的日期时间处理函数,方便开发者进行日期和时间的操作。本文将详细介绍 PowerBuilder 中常用的日期时间函数及其应用场景。 #### 二、Today() 函数 **功能:** 获取当前系统的日期,某些情况下也会获取...
"MySQL 日期函数和时间函数及加减运算" MySQL 日期函数和时间函数是 MySQL 中非常重要的函数,用于处理日期和时间数据类型。这些函数可以帮助开发者快速获得当前日期和时间、执行日期和时间相关的操作。 获得当前...
mssql 日期函数总结 MS SQL Server 提供了丰富的日期函数,开发中经常会用到。下面总结了常用的日期函数: 1. 获取当前时间 `GETDATE()` 函数用于获取当前的日期和时间,精确到毫秒。 示例:`SELECT GETDATE()` ...
Oracle 日期函数是 Oracle 数据库中的一组功能强大且广泛使用的函数,它们可以对日期进行各种操作和计算,本次练习涵盖了 Oracle 中常用的日期函数,包括获取当前系统时间、对日期的月进行加减、获取给定日期所在月...