strftime、strptime和stime的使用

本文介绍了C语言中的时间操作函数,包括strftime用于将时间结构转换为字符串、strptime用于将字符串转换为时间结构、stime用于设置系统时间。文章通过具体示例展示了如何使用这些函数进行时间的格式化和解析。

1、strftime

函数的功能是把一个tm结构的时间序列化为一个字符串

#include <time.h>

       size_t strftime(char *s, size_t max, const char *format,
                       const struct tm *tm);

参数:

char *s: 字符串指针 输出

size_t max: 字符串最大长度 输入

const char *format: 输出格式

const struct tm *tm: 时间 输入

返回值:

成功:处理结果字符串str中字符的个数
失败:0

格式如下:

%a 星期几的简写
%A 星期几的全称
%b 月份的简写
%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 每周的第几天,星期一为第一天 (值从1到7,星期一为1)
%U 第年的第几周,把星期日作为第一天(值从0到53)
%V 每年的第几周,使用基于周的年
%w 十进制表示的星期几(值从0到6,星期天为0)
%W 每年的第几周,把星期一做为第一天(值从0到53)
%x 标准的日期串
%X 标准的时间串
%y 不带世纪的十进制年份(值从0到99)
%Y 带世纪部分的十制年份
%z,%Z 时区名称,如果不能得到时区名称则返回空字符。
%%  百分号
2、strptime

函数的功能是把一个字符串序列化为一个tm结构的时间

#define _XOPEN_SOURCE /* glibc2 needs this */
       #include <time.h>

       char *strptime(const char *s, const char *format, struct tm *tm);

参数:

const char *s: 字符串 输入

const char *format: 输入的格式

tm: 时间 输出

返回值:

成功:*s的最后位置

失败:NULL

3、stime

设置本地系统时间

#include <time.h>

       int stime(time_t *t);

   Feature Test Macro Requirements for glibc (see feature_test_macros(7)):

       stime(): _SVID_SOURCE
参数:

t: 日历时间 输入

返回值:

成功: 0

失败:-1

4、代码示例

设置本地系统时间

#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>

void SyncDateTime(const char *time)
{
    struct tm temp;
    printf("need to syncDateTime: %s\n", time);
    if (strptime(time, "%Y-%m-%d %H:%M:%S", &temp) == NULL)
    {
        perror("strptime failed.\n");
    }

    time_t t = mktime(&temp);

    if (stime(&t) == -1)
    {
        perror("stime failed.\n");
    }

    return ;
}

int main()
{
    const char buf[] = "2015-03-05 10:11:50";
    
    SyncDateTime(buf);

    
    return 0;
}




#ifndef _TIME_H #define _TIME_H #ifdef __cplusplus extern "C" { #endif #include <features.h> #ifdef __cplusplus #define NULL 0L #else #define NULL ((void*)0) #endif #define __NEED_size_t #define __NEED_time_t #define __NEED_clock_t #define __NEED_struct_timespec #if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \ || defined(_BSD_SOURCE) #define __NEED_clockid_t #define __NEED_timer_t #define __NEED_pid_t #define __NEED_locale_t #endif #include <bits/alltypes.h> #if defined(_BSD_SOURCE) || defined(_GNU_SOURCE) #define __tm_gmtoff tm_gmtoff #define __tm_zone tm_zone #endif struct tm { int tm_sec; int tm_min; int tm_hour; int tm_mday; int tm_mon; int tm_year; int tm_wday; int tm_yday; int tm_isdst; long __tm_gmtoff; const char *__tm_zone; }; clock_t clock (void); time_t time (time_t *); double difftime (time_t, time_t); time_t mktime (struct tm *); size_t strftime (char *__restrict, size_t, const char *__restrict, const struct tm *__restrict); struct tm *gmtime (const time_t *); struct tm *localtime (const time_t *); char *asctime (const struct tm *); char *ctime (const time_t *); int timespec_get(struct timespec *, int); #define CLOCKS_PER_SEC 1000000L #define TIME_UTC 1 #if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \ || defined(_BSD_SOURCE) size_t strftime_l (char * __restrict, size_t, const char * __restrict, const struct tm * __restrict, locale_t); struct tm *gmtime_r (const time_t *__restrict, struct tm *__restrict); struct tm *localtime_r (const time_t *__restrict, struct tm *__restrict); char *asctime_r (const struct tm *__restrict, char *__restrict); char *ctime_r (const time_t *, char *); void tzset (void); struct itimerspec { struct timespec it_interval; struct timespec it_value; }; #define CLOCK_REALTIME 0 #define CLOCK_MONOTONIC 1 #define CLOCK_PROCESS_CPUTIME_ID 2 #define CLOCK_THREAD_CPUTIME_ID 3 #define CLOCK_MONOTONIC_RAW 4 #define CLOCK_REALTIME_COARSE 5 #define CLOCK_MONOTONIC_COARSE 6 #define CLOCK_BOOTTIME 7 #define CLOCK_REALTIME_ALARM 8 #define CLOCK_BOOTTIME_ALARM 9 #define CLOCK_SGI_CYCLE 10 #define CLOCK_TAI 11 #define TIMER_ABSTIME 1 int nanosleep (const struct timespec *, struct timespec *); int clock_getres (clockid_t, struct timespec *); int clock_gettime (clockid_t, struct timespec *); int clock_settime (clockid_t, const struct timespec *); int clock_nanosleep (clockid_t, int, const struct timespec *, struct timespec *); int clock_getcpuclockid (pid_t, clockid_t *); struct sigevent; int timer_create (clockid_t, struct sigevent *__restrict, timer_t *__restrict); int timer_delete (timer_t); int timer_settime (timer_t, int, const struct itimerspec *__restrict, struct itimerspec *__restrict); int timer_gettime (timer_t, struct itimerspec *); int timer_getoverrun (timer_t); extern char *tzname[2]; #endif #if defined(_XOPEN_SOURCE) || defined(_BSD_SOURCE) || defined(_GNU_SOURCE) char *strptime (const char *__restrict, const char *__restrict, struct tm *__restrict); extern int daylight; extern long timezone; extern int getdate_err; struct tm *getdate (const char *); #endif #if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) int stime(const time_t *); time_t timegm(struct tm *); #endif #ifdef __cplusplus } #endif #endif 以上是我的交叉工具链中的time.h定义,所以time_t到底在哪里定义的
最新发布
11-20
### Python 中 strftime strptime 的用法 `strftime` `strptime` 是 Python 标准库模块 `datetime` 提供的重要函数,分别用于将日期时间对象格式化为字符串以及将字符串解析为日期时间对象。 --- #### 1. `strftime`: 将日期时间对象转换为字符串 `strftime` 函数允许开发者通过指定的格式模板将日期时间对象 (`datetime`, `date`, 或 `time`) 转换为人类可读的字符串形式。 ##### 基本语法 ```python datetime_object.strftime(format_string) ``` - **datetime_object**: 需要被格式化的日期时间对象。 - **format_string**: 定义输出字符串格式的模板。 ##### 示例代码 以下是一些典型的 `strftime` 使用场景: ```python from datetime import datetime now = datetime.now() # 输出当前时间的完整表示 formatted_date_full = now.strftime("%Y-%m-%d %H:%M:%S") # e.g., '2023-10-05 14:30:00' [^1] # 输出仅包含日期部分 formatted_date_only = now.strftime("%Y-%m-%d") # e.g., '2023-10-05' # 输出仅包含时间部分 formatted_time_only = now.strftime("%H:%M:%S") # e.g., '14:30:00' # 自定义格式:星期几、月份名称等 custom_formatted = now.strftime("%A, %B %d, %Y") # e.g., 'Thursday, October 05, 2023' ``` --- #### 2. `strptime`: 将字符串解析为日期时间对象 `strptime` 函数的作用正好相反于 `strftime`,它可以根据给定的格式模板将字符串解析为对应的日期时间对象。 ##### 基本语法 ```python datetime.strptime(string_to_parse, format_string) ``` - **string_to_parse**: 待解析的日期时间字符串。 - **format_string**: 定义输入字符串格式的模板。 ##### 示例代码 以下是一些典型的 `strptime` 使用场景: ```python from datetime import datetime # 解析完整的日期时间字符串 parsed_datetime = datetime.strptime("2023-10-05 14:30:00", "%Y-%m-%d %H:%M:%S") # e.g., datetime(2023, 10, 5, 14, 30) # 解析仅有日期部分的字符串 parsed_date = datetime.strptime("2023-10-05", "%Y-%m-%d").date() # e.g., date(2023, 10, 5) # 解析仅有时间部分的字符串 parsed_time = datetime.strptime("14:30:00", "%H:%M:%S").time() # e.g., time(14, 30, 0) # 处理自定义格式的字符串 custom_parsed = datetime.strptime("Thursday, October 05, 2023", "%A, %B %d, %Y") # e.g., datetime(2023, 10, 5) ``` --- #### 3. 常见格式化字符对照表 以下是常用的格式化字符及其含义: | 字符 | 描述 | 示例 | |------|--------------------------|---------------| | `%Y` | 四位数年份 | 2023 | | `%y` | 两位数年份 | 23 | | `%m` | 月份(零填充) | 01 到 12 | | `%d` | 日(零填充) | 01 到 31 | | `%H` | 小时(24小时制,零填充) | 00 到 23 | | `%I` | 小时(12小时制,零填充) | 01 到 12 | | `%M` | 分钟(零填充) | 00 到 59 | | `%S` | 秒(零填充) | 00 到 59 | | `%f` | 微妙 | 000000 到 999999| | `%a` | 星期缩写 | Mon | | `%A` | 星期全名 | Monday | | `%b` | 月份缩写 | Jan | | `%B` | 月份全名 | January | 更多信息可以参考官方文档[^1]。 --- #### 4. 实际应用场景对比 下面是一个综合的例子,展示了如何结合 `strftime` `strptime` 进行日期时间的操作: ```python from datetime import datetime # 输入字符串 input_str = "Oct 5, 2023" # 使用 strptime 将字符串解析为日期时间对象 dt_obj = datetime.strptime(input_str, "%b %d, %Y") # 使用 strftime 将日期时间对象格式化为新的字符串 output_str = dt_obj.strftime("%Y-%m-%d") print(f"Original String: {input_str}") # Original String: Oct 5, 2023 print(f"Parsed & Formatted Date: {output_str}") # Parsed & Formatted Date: 2023-10-05 ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值