`

时间和日期函数

阅读更多
    UNIX 内核提供的基本时间服务是计算自协调世界时(Coordinated Universal Time, UTC)公元 1970 年 1 月 1 日 00:00:00 这一特定时间以来经过的秒数(以数据类型 time_t 表示),通常称之为为日历时间。日历时间包括时间和日期,可自动进行变换,如变换到夏令时。
    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。
  • 大小: 11.8 KB
  • 大小: 15.4 KB
  • 大小: 40.3 KB
分享到:
评论

相关推荐

    c语言函数库-第六章(时间和日期函数)

    ### C语言函数库第六章(时间和日期函数) 在C语言中,处理时间和日期的功能非常重要,尤其是在需要进行时间戳记录、日期计算或者定时任务等场景。本章节将详细介绍C语言中的几个关键时间与日期处理函数,包括`...

    mysql 中 时间和日期函数.docx

    在MySQL数据库系统中,时间和日期函数是用于处理和操作日期和时间数据的重要工具。这些函数使得在SQL查询中获取、格式化或计算日期和时间变得非常便捷。以下是一些主要的时间和日期函数的详细说明: 1. **当前日期...

    GO时间和日期函数详解.go

    GO时间和日期函数详解

    C# 常用日期时间函数

    在C#编程中,日期和时间操作是常见的需求,用于处理和展示各种日期时间相关的数据。DateTime类是C#中处理日期和时间的核心类,它提供了...了解并熟练掌握这些函数和方法对于编写高效、准确的日期时间处理代码至关重要。

    Clickhouse 时间日期函数

    ClickHouse是一个开源的列式数据库管理系统,它提供了丰富的时间日期函数来处理和操作时间和日期数据。以下是ClickHouse中常用的时间日期函数的简介: 1. toDate(date_expression):将日期表达式转换为日期类型。...

    Gbase 8s内置函数之日期函数

    其中,日期函数是Gbase 8s内置函数中的一部分,主要用于处理和操作日期和时间数据。本文将详细介绍Gbase 8s内置函数中的日期函数,包括SYSDATE、CURRENT、TODAY、LAST_DAY、YEAR、MONTH、DAY、WEEKDAY、QUARTER、ADD...

    python中关于时间和日期函数的常用计算总结(time和datatime)

    2.获取上个月最后一天的日期(本月的第一天减去1天) 复制代码 代码如下:last = datetime.date(datetime.date.today().year,datetime.date.today().month,1)-datetime.timedelta(1)print last 3.获取时间差(时间差单位...

    SQL中常用的的时间跟日期函数

    在SQL(结构化查询语言)中,时间与日期函数是处理日期和时间数据的重要工具,它们可以帮助我们进行各种时间相关的计算、格式化和提取操作。本文将深入探讨SQL中的主要时间与日期函数,并通过实例来展示其具体用法。...

    mysql时间日期函数

    在MySQL数据库中,时间日期函数是处理与时间相关的数据时不可或缺的一部分。这些函数提供了丰富的功能,可以帮助用户在查询、更新或插入数据时精确地操作日期和时间。下面将详细介绍几个核心的时间日期函数及其应用...

    oracle自定义日期函数

    Oracle 自定义日期函数 Oracle 日期处理函数是数据库管理系统中非常重要的一部分,最近看到有人在做 T-SQL 与 PL/SQL 的转化,问了些有关时间函数的处理。在 PL/SQL 中,Oracle 提供了其他的方法来处理日期函数,...

    日期函数_vb日期函数_

    在VB(Visual Basic)编程语言中,日期函数是处理日期和时间值的重要工具。这些函数允许程序员进行日期的计算、格式化以及与日期相关的各种操作。以下是一些关键的VB日期函数及其详细说明: 1. **Date()**:这个...

    MYSQL 日期函数大全

    MYSQL 日期函数大全,供大家一起共同分享学习。

    mysql的日期和时间函数.rar

    MySQL是世界上最受欢迎的关系型数据库管理系统之一,其在处理日期和时间数据方面提供了丰富的函数和操作。日期和时间函数是MySQL中的重要组成部分,它们允许我们进行日期和时间的计算、格式化以及各种操作,极大地...

    SQLSERVER时间日期函数详解

    SQL Server 提供了多种时间日期函数,帮助开发者快速处理日期和时间相关的操作。下面将对这些函数进行详解,并提供示例。 1. GetDate() 函数 GetDate() 函数用于返回当前系统的日期和时间。语法如下: SELECT ...

    MySQL时间日期相关函数

    了解并熟练掌握这些时间日期函数,能极大地提升你在数据库查询和数据处理中的效率。 例如,以下是一个示例查询,找出所有在2022年1月1日后创建的记录: ```sql SELECT * FROM table_name WHERE created_at &gt; DATE('...

    delphi、 sql 日期时间函数

    在实际开发中,结合使用Delphi的日期处理函数和SQL的日期时间函数,可以构建出强大的数据处理和分析系统。例如,你可能需要在Delphi程序中获取当前日期,然后将这个日期插入到MSSQL数据库中,或者根据用户输入的日期...

    PowerBuilder常用日期时间函数

    它提供了丰富的日期时间处理函数,方便开发者进行日期和时间的操作。本文将详细介绍 PowerBuilder 中常用的日期时间函数及其应用场景。 #### 二、Today() 函数 **功能:** 获取当前系统的日期,某些情况下也会获取...

    mysql日期函数时间函数及加减运算

    "MySQL 日期函数和时间函数及加减运算" MySQL 日期函数和时间函数是 MySQL 中非常重要的函数,用于处理日期和时间数据类型。这些函数可以帮助开发者快速获得当前日期和时间、执行日期和时间相关的操作。 获得当前...

    mssql日期函数总结

    mssql 日期函数总结 MS SQL Server 提供了丰富的日期函数,开发中经常会用到。下面总结了常用的日期函数: 1. 获取当前时间 `GETDATE()` 函数用于获取当前的日期和时间,精确到毫秒。 示例:`SELECT GETDATE()` ...

    Oracle日期函数练习

    Oracle 日期函数是 Oracle 数据库中的一组功能强大且广泛使用的函数,它们可以对日期进行各种操作和计算,本次练习涵盖了 Oracle 中常用的日期函数,包括获取当前系统时间、对日期的月进行加减、获取给定日期所在月...

Global site tag (gtag.js) - Google Analytics