Programación del sistema Linux C (05) programación de tiempo y calendario

Hay dos tipos de tiempo en Linux / Unix:

  1. Hora del sistema: generalmente datos enteros largos, la unidad es segundos.
  2. Hora del calendario: está más cerca de la representación de la hora familiar, y el año, mes, día, hora, minuto, segundo y día de la hora están marcados más apropiadamente por una estructura tm. De hecho, es solo una transformación estructural.

1 hora del sistema

En el sistema Linux / Unix, se utiliza el método de tiempo coordinado de tiempo global, que describe el número de segundos que han pasado desde el 1 de enero de 1970. El tipo de datos de este valor es time_t, un dato largo.  

1.1 función de tiempo

En Linux, use la función de hora para proporcionar la hora actual del proceso. La definición de la función de tiempo es la siguiente:

#include <time.h>
time_t time(time_t *t);
参数t:一个指向time_t类型的指针,当此值为NULL的时候函数将从纪元至今的时间写入t中。
函数执行成功,返回值是从纪元至今的时间(秒数);失败返回-1。

Si la función de tiempo no puede satisfacer las necesidades de precisión del usuario, también puede usar la función gettimeofday () en sistemas Linux / Unix para obtener datos de mayor precisión.

1.2 función gettimeofday y conocimiento relacionado

1.2.1 función gettiemofday

En Linux, use la función gettimeofday para obtener un tiempo de mayor precisión. La definición de la función gettimeofday es la siguiente:

#include <sys/time.h>
int gettimeofday(struct timeval *tv, struct timezone *tz);
int settimeofday(const struct timeval *tv, const struct timezone *tz);
参数tv:一个指向timeval结构体的指针,函数执行成功后存放当前的系统时间值,这是一个值结果参数。
参数tz:一个指向timezone结构体的指针,此参数与时区有关,函数执行成功后存放当地时区的信息,但是一般不用的时候置为NULL。这是一个值结果参数。
注意:tz参数的作用需要系统支持,在某些系统中会产生错误的值,所以在调用的时候需要仔细查看手册。
函数执行成功或失败均返回0。

1.2.2 Descripción de la estructura timeval y timezone

El timeval de estructura y la zona horaria de estructura se definen de la siguiente manera:

     struct timeval{
          time_t tv_sec;     //秒数
          timez_t tv_usec;     //微秒数
     };
     struct timezone{
          int tz_minutewest;     //格林威治向西的分钟数,即与greenwich 时间差了多少分钟
          int tz_dsttime;          //夏令时修正的类型
     };

1.2.3 Explicación de la función settimeofday
Para settimeofday: establezca la hora actual en la información de estructura indicada por tv, y la información de zona horaria local en la estructura indicada por tz. ( Tenga en cuenta que solo la autoridad raíz puede usar esta función para modificar el tiempo). En caso de éxito, devuelve 0, en caso de error, devuelve -1 y el código de error se almacena en errno. La explicación de errno es la siguiente:

  • EPERM no llama a settimeofday () con autoridad de root, y la autoridad no es suficiente.
  • La zona horaria EINVAL o ciertos datos son incorrectos y la hora no se puede configurar correctamente.

Si tv o tz es NULL, significa que no está interesado en información relacionada.

1.2.4 Operación del valor de tipo de estructura timeval

Las cinco macros se definen de la siguiente manera:

timerisset(tvp):设置tvp的sec属性和usec属性。    
timerclear(tvp):tvp的sec属性和usec属性置为0。
timercmp(a,b,CMP):比较a,b的值。CMP的取值有>、<、=;比较正确则返回0,错误返回非0值。
timeradd(a,b,result):分别取a,b的sec属性和usec属性,对其进行+操作,结果放在result中。
timersub(a,b,result):分别取a,b的sec属性和usec属性,对其进行-操作,结果放在result中。

La función difftime se usa para calcular la diferencia en segundos entre dos valores de tiempo de tipo time_t. La definición de la función difftime es la siguiente:

#include <time.h>
double difftime(time_t time1, time_t time2);
函数中参数表示time_t类型的时间值,返回值为一个浮点数,表示2个时间值之间的秒数差。

2 tiempo calendario

2.1 Introducción a la estructura tm

La estructura de tiempo del calendario del sistema struct tm se define en Linux / Unix. La información detallada es la siguiente:

struct tm
{
       int tm_sec;                   /* Seconds.     [0-60] (1 leap second) */
     int tm_min;                   /* Minutes.     [0-59] */
       int tm_hour;                  /* Hours.       [0-23] */
       int tm_mday;                  /* Day.         [1-31] */
       int tm_mon;                   /* Month.       [0-11] */
       int tm_year;                  /* Year - 1900.  */
       int tm_wday;                  /* Day of week. [0-6] */
       int tm_yday;                  /* Days in year.[0-365] */
       int tm_isdst;                 /* DST.         [-1/0/1]*/
    
#ifdef  __USE_BSD
     long int tm_gmtoff;           /* Seconds east of UTC.  */
       __const char *tm_zone;        /* Timezone abbreviation.  */
#else
     long int __tm_gmtoff;         /* Seconds east of UTC.  */
       __const char *__tm_zone;      /* Timezone abbreviation.  */
#endif
};

Nota: Se requieren los primeros 9 miembros de la estructura tm. Para los siguientes 2 miembros, habrá diferencias según el sistema.

  • El miembro tm_gmtoff / __ tm_gmtoff representa los segundos positivos de la zona horaria oriental UTC / segundos negativos de la zona horaria occidental UTC en la zona horaria este de la línea de cambio de fecha.
  • El miembro tm_zone / __ tm_zone representa el nombre de la zona horaria actual (relacionada con la variable de entorno TZ).

2.2 Funciones de tiempo y estructuras de otros sistemas

2.2.1 estructura de tiempos específicos

En comparación con la estructura timeval, la precisión ha mejorado mucho, la estructura puede ser precisa hasta una billonésima de segundo. La estructura se define de la siguiente manera:

struct timespec{
     long int tv_sec;
     long int tv_usec;
};

Pero al mismo tiempo, la estructura también necesita más espacio para almacenar.

2.2.2 Funciones comunes de conversión de tipo de tiempo en el archivo time.h:

#include <time.h>

@ 1 Use la función asctime en linux para convertir el tiempo del tipo de estructura tm a código asc:

char *asctime(const struct tm *tm);
char *asctime_r(const struct tm *tm, char *buf);
    参数tm:指向要转换的tm结构的指针。
    参数buf:用户缓冲区,一个副本的存储。
得到机器时间(日期时间转换为ASCII码);对于asctime_r函数,只是多了一个存储数据的buf,和返回值是一样的。

@ 2 Use la función ctime bajo linux para convertir la hora del tipo de estructura time_t en código asc:

char *ctime(const time_t *timep);
char *ctime_r(const time_t *timep, char *buf);
    参数timep:指向要转换的time_t结构的指针
    参数buf:用户缓冲区,一个副本的存储。
得到日历时间(日期时间转换为ASCII码) ;对于ctime_r函数,只是多了一个存储数据的buf,和返回值是一样的。

@ 3 linux usa la función gmtime para convertir el tiempo del tipo de estructura time_t en una estructura del tipo tm, pero es diferente de la función localtime:

struct tm *gmtime(const time_t *timep);
struct tm *gmtime_r(const time_t *timep, struct tm *result);
    参数timep:指向要转换的time_t结构的指针。
    参数result:用户缓冲区,一个返回值副本的存储。
函数的返回值是指向tm结构体指针,表示的是国际标准时间。对于gmtime_r函数,只是多了一个存储数据的buf,和返回值是一样的。

@ 4 La función localtime se usa en Linux para convertir el tiempo del tipo de estructura time_t a la estructura del tipo tm, pero es diferente de la función gmtime:

struct tm *localtime(const time_t *timep);
struct tm *localtime_r(const time_t *timep, struct tm *result);
    参数timep:指向要转换的time_t结构的指针。
    参数result:用户缓冲区,一个返回值副本的存储。
    函数的返回值是指向tm结构体指针,表示的是本地时间。对于localtime_r函数,只是多了一个存储数据的buf,和返回值是一样的。

@ 5 La función mktime se usa en Linux para convertir la variable del tipo de estructura tm en el tipo de time_t:

time_t mktime(struct tm *tm);
    参数tm指向日历时间结构的指针。
    函数执行成功返回相应的系统时间(受系统环境TZ(timezone)变量影响),失败返回-1。

2.2.3 función strftime

La función strftime proporciona una salida más flexible de la función time: el prototipo de la función strftime es el siguiente:

#include <time.h>
size_t strftime(char *s, size_t max, const char *format,const struct tm *tm);
参数 buf:字符数组指针,存放函数的格式化输出结果。
参数 max:设定了该数组的长度。
参数format:时间值的格式字符。
  %a 星期几的简写
  %A 星期几的全称
  %b 月份的简写,3字符形式缩写
  %B 月份的全称
  %c 标准的日期的时间串
  %C 年份的后两位数字
  %d 十进制表示的每月的第几天
  %D 月/天/年
  %e 在两字符域中,十进制表示的每月的第几天
  %F 年-月-日
  %g 年份的后两位数字,使用基于周的年
  %G 年份,使用基于周的年
  %h 简写的月份名
  %H 24小时制的小时
  %I 12小时制的小时
  %j 十进制表示的每年的第几天
  %m 十进制表示的月份
  %M 十时制表示的分钟数
  %n 新行符
  %p 本地的AM或PM的等价显示
  %r 12小时的时间
  %R 显示小时和分钟:hh:mm
  %S 十进制的秒数
  %t 水平制表符
  %T 显示时分秒:hh:mm:ss
  %u 每周的第几天,星期一为第一天 (值从0到6,星期一为0)
  %U 第年的第几周,把星期日作为第一天(值从0到53)
  %V 每年的第几周,使用基于周的年
  %w 十进制表示的星期几(值从0到6,星期天为0)
  %W 每年的第几周,把星期一做为第一天(值从0到53)
  %x 标准的日期串
  %X 标准的时间串
  %y 不带世纪的十进制年份(值从0到99)
  %Y 带世纪部分的十制年份
  %z,%Z 时区名称,如果不能得到时区名称则返回空字符。
  %% 百分号
参数tm:要转换的时间结构体。
注意:对于strptime函数,在ANSI和POSIX中均没有定义,所以不具有可移植性,使用较少。

 

Publicado 289 artículos originales · elogiados 47 · 30,000+ vistas

Supongo que te gusta

Origin blog.csdn.net/vviccc/article/details/105149178
Recomendado
Clasificación