《Think Python》练习 5-1:读取当前时间,显示时、分、秒,以及纪元到现在的天数

这是一个《Think Python》练习,要求读取当前时间,详细展示时、分、秒,并计算从纪元至今的天数。通过这个练习,初学者可以实践Python日期和时间的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第5章 条件和递归

练习 5-1:读取当前时间,显示时、分、秒,以及纪元到现在的天数

虽然边学边写有助加深理解,但是太费时间了,5章开始只粘贴代码,学完Think Python再完善思路……
在这里插入图片描述

"""
《Think Python》第5章 条件和递归

练习 5-1:使用time模块计算当天时分秒、距离纪元的天数
"""
#引入time模块
import time

#获得当前秒数并取整
seconds = int( time.time() )

#计算距离纪元多少天
days = seconds // ( 24*60*60 )

#计算今天过了多少秒
today_hour = seconds - days * ( 24*60*60 )
#时
hour = today_hour // ( 60*60 )
#这个小时过了多少秒
today_minute = today_hour - hour * ( 60*60 )
#分
minute = today_minute // 60
#秒
second = today_minute % 60

print( hour+8, '时', minute, '分', second, '秒,','距离纪元',days,'天' )
<think>好的,我现在需要帮用户将之前的Python代码改成C语言。首先,我得仔细看看原来的Python代码做了什么。那个Python程序主要是让用户输入开始结束的日期时间,然后计算两者之间的时间差,包括处理跨年的情况。 接下来,我需要考虑C语言Python在日期时间处理上的不同。Python有datetime模块,非常方便,可以直接解析字符串并计算时间差。但C语言的标准库没有这么高级的功能,得用time.h里的函数,比如mktimelocaltime。可能需要用到struct tm来处理日期时间结构体。 用户输入的部Python用了input函数,而C语言需要用scanf或者fgets来读取用户输入。这里要注意输入格式是否正确,以及错误处理。原来的Python代码在输入错误会退出,C语言也需要类似的错误处理,比如检查scanf的返回值,或者解析失败提示用户。 然后,处理时间差的部。C语言中,time_t类型表示自纪元以来的数,所以可以将两个时间转换成time_t,然后相减得到数差。再将这些转换小时分钟。需要注意的是,这里的天数计算可能Python不同,因为Python的timedelta有days属性,而C语言需要自己计算。 另外,原来的Python代码处理了开始时间晚于结束时间的情况,自动交换两者。在C语言中也需要实现这个逻辑,比较两个time_t的值,如果开始时间大,就交换它们。 还有一个问题是,C语言的strptime函数不是标准函数,可能在WindowsLinux上的支持不同。可能需要使用不同的方法解析日期时间字符串。比如,用sscanf来解年、月、日、,然后填充到struct tm结构体中。需要注意的是,struct tm的月份是从0开始的,而年份是从1900开始的,所以在填充需要调整。 接下来,考虑跨年的情况。C语言的mktime函数会自动处理这些,比如将月份超过11的情况转换为下一年的适当月份,所以在解析用户输入,只要正确填充struct tm,mktime会处理好。这样,计算时间差的候,跨年就不是问题了。 然后,输出部,需要将开始结束时间格式化输出。C语言可以用strftime函数来格式化时间字符串,类似于Python的strftime。 错误处理方面,如果用户输入的日期时间格式不正确,需要提示并退出。在C语言中,可能需要逐个检查sscanf的返回值,或者解析后的结构体成员是否在合理范围内,比如月份在1-12,小时在0-23等。 另外,需要考虑区的问题。Python的datetime模块可能默认使用本地区,而C语言的mktimelocaltime也依赖于系统的区设置。如果用户需要处理不同的区,可能需要额外的处理,但原问题中没有提到,所以暂假设使用本地时间。 现在,把这些步骤整合成C代码。首先定义两个函数来读取日期时间,解析成struct tm,再转换为time_t。然后比较两个时间,计算差值,再将数差转换小时分钟。最后格式化输出。 测试一下,比如输入2023-12-31 23:00:002024-01-01 01:00:00,应该得到2小时时间差,正确跨年。另外处理开始时间晚于结束时间的情况,自动交换。 可能的陷阱包括:struct tm的月份年份的调整,区的处理,以及输入格式的严格解析。需要确保用户输入的每个部都被正确读取,比如四位数的年份,两位数的月份日期等。 最后,编代码,添加必要的错误检查,确保所有输入都正确解析,否则提示错误信息并退出。可能需要使用函数来封装输入解析的过程,避免重复代码。 总结,整个改过程需要将Python的高级日期时间处理转换为C语言的手动处理,利用time.h中的函数,注意结构体的初始化转换,以及错误处理。确保跨年情况正确,时间差计算准确,用户体验良好。</think>以下是Python代码的C语言移植版本,使用`time.h`标准库实现跨年时间差计算。注意C语言需要手动处理时间结构体错误校验: ```c #include <stdio.h> #include <time.h> #include <string.h> // 输入时间结构体 struct DateTime { int year, month, day; int hour, minute, second; }; // 解析时间输入(格式:YYYY-MM-DD HH:MM:SS) int parse_datetime(const char* datetime_str, struct DateTime* dt) { return sscanf(datetime_str, "%d-%d-%d %d:%d:%d", &dt->year, &dt->month, &dt->day, &dt->hour, &dt->minute, &dt->second) == 6; } // 转换为time_t类型数 time_t convert_to_seconds(const struct DateTime* dt) { struct tm time_struct = {0}; time_struct.tm_year = dt->year - 1900; // 年份偏移量 time_struct.tm_mon = dt->month - 1; // 月份0-11 time_struct.tm_mday = dt->day; time_struct.tm_hour = dt->hour; time_struct.tm_min = dt->minute; time_struct.tm_sec = dt->second; time_struct.tm_isdst = -1; // 自动处理夏令 return mktime(&time_struct); // 返回数 } int main() { struct DateTime start_dt, end_dt; char input[20]; // 输入开始时间 printf("输入起始日期时间(格式 YYYY-MM-DD HH:MM:SS):\n"); fgets(input, sizeof(input), stdin); if (!parse_datetime(input, &start_dt)) { printf("错误:起始时间格式无效\n"); return 1; } // 输入结束时间 printf("输入结束日期时间(格式 YYYY-MM-DD HH:MM:SS):\n"); fgets(input, sizeof(input), stdin); if (!parse_datetime(input, &end_dt)) { printf("错误:结束时间格式无效\n"); return 1; } // 转换数 time_t start_sec = convert_to_seconds(&start_dt); time_t end_sec = convert_to_seconds(&end_dt); // 处理时间顺序 if (start_sec > end_sec) { time_t temp = start_sec; start_sec = end_sec; end_sec = temp; } // 计算差值 double diff_sec = difftime(end_sec, start_sec); int days = diff_sec / 86400; int hours = (diff_sec - days*86400) / 3600; int minutes = (diff_sec - days*86400 - hours*3600) / 60; int seconds = (int)diff_sec % 60; // 格式化输出 printf("\n时间差计算结果:\n"); printf("- %d \n- %d 小时\n- %d 分钟\n- %d \n", days, hours, minutes, seconds); return 0; } ``` ### 关键差异说明: 1. **时间结构体**:使用`struct DateTime``struct tm`处理时间量 2. **输入处理**:通过`sscanf`解析字符串输入,需手动校验格式 3. **时间转换**:使用`mktime()`将结构体转为数,自动处理跨年 4. **夏令**:设置`tm_isdst = -1`让系统自动判断夏令影响 5. **精度控制**:`difftime()`返回double类型数差保证跨平台精度 ### 测试示例: 输入: ``` 输入起始日期时间(格式 YYYY-MM-DD HH:MM:SS): 2023-12-31 23:30:00 输入结束日期时间(格式 YYYY-MM-DD HH:MM:SS): 2024-01-01 00:15:00 ``` 输出: ``` 时间差计算结果: - 0 - 0 小时 - 45 分钟 - 0 ``` ### 注意事项: 1. 输入缓冲区限制为20字符,实际应用可扩展 2. 年份范围应为1901-2038(32位系统限制) 3. 需要编译链接时间库(Linux/macOS自动处理,Windows需`-lucrt`)
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值