在C语言中如何处理时间和日期

Chuck Allison 是盐湖城圣 Latter Day 教堂总部下耶稣教堂家族历史研究处的软件体系设计师。他拥有数学学士和数学硕士学位。他从1975年起开始编程,从1984年起他开始从事c语言的教学和开发。他目前的兴趣是面向对象的技术及其教育。他是X3J16,ANSI C ++标准化委员会的一员。

大部分的操作系统有办法得到当前的日期和时间。通过定义在time.h的库函数,ANSI C能以许多不同的形式得到这个信息。函数time返回一个类型为time_t的值(通常为long),该函数在运行期间对当前的日期和时间进行编码。然后你可以将这个返回值传递给其他能对该值进行解码和格式化的函数。

Listing 1 中的程序使用函数time,localtime和strftime以不同的形式输出当前的日期和时间。函数localtime把已经编码的时间解码成如下的struct:

struct tm
{
    int tm_sec; /* (0 - 61) */
    int tm_min; /* (0 - 59) */
    int tm_hour; /* (0 - 23) */
    int tm_mday; /* (1 - 31) */
    int tm_mon; /* (0 - 11) */
    int tm_year; /* past 1900 */
    int tm_wday; /* (0 - 6) */
    int tm_yday; /* (0 - 365) */
    int tm_isdst; /* daylight savings flag */
};

每次当你调用localtime的时候,它会重写一个静态的结构并返回该结构的地址(因此同一时刻在一个程序中只能取得一个这样的结构,而不能做明显的拷贝)。函数ctime返回一个指向静态字符串的指针,该字符串以标准的格式包含了完整的时间和日期。strftime根据用户的指定格式格式化字符串(例如,%A代表一周中每一天的名称)。Table 1列出了格式描述符的完整列表。

时间/日期运算

通过改变tm结构里的值,可对时间/日期进行运算。Listing 2 中的程序展示了如何计算将来某天的日期和以秒为单位所计算出的程序执行时间。注意函数time的语法(参数time_t由地址传入,并非作为函数的返回值)。函数mktime改变tm结构的值,以便日期和时间在一个合适的范围内,之后day-of-week (tm_wday)和day-of-year (tm_yday)域进行相应的更新。mktime将tm结构中日期和时间的值置于合适的范围之内,相应的更新day of week (tm-wday)和day of year (tm-yday)的值。这种情况发生在当一个日期超出了你的实现能够支持的范围的时候。例如,我的MS-DOS的编译器不能编码1970年1月份之前的日期。函数asctime返回tm参数所描述时间的标准字符串(因此ctime (&tval)与asctime (localtime(&tval)是相等的)。函数difftime返回用秒做单位的两个time_t的差。

如果需要处理超出系统范围的日期,或者需要计算两个日期的间隔又不是用秒来做单位,那你需要设计自己的date编码。Listing 3 到 Listing 5 中的应用程序通过使用一个简单的month-day-year结构,展示了确定两个日期间隔的年数、月份数和天数的技术。日期的相减就像你在小学里做的减法那样(例如,首先进行天数的相减,如果需要就向月份数借位,以此类推)。注意跳过的年份都被计算进去了。为了简略起见,date_interval函数假设日期都是有效的,并且第一个日期在第二个日期之前。函数返回一个指向静态Date结构的指针,该结构包含了我们想要的答案。

时间: 2024-10-21 18:52:27

在C语言中如何处理时间和日期的相关文章

C语言中对时间和日期的处理

本文详细介绍C语言中对时间和日期的处理 Chuck Allison 是盐湖城圣 Latter Day 教堂总部下耶稣教堂家族历史研究处的软件体系设计师.他拥有数学学士和数学硕士学位.他从1975年起开始编程,从1984年起他开始从事c语言的教学和开发.他目前的兴趣是面向对象的技术及其教育.他是X3J16,ANSI C ++标准化委员会的一员.发送e-mail到 allison@decus.org,或者拨打电话到 (801)240-4510 均可以与他取得联系. 大部分的操作系统有办法得到当前的日

Excel2007中正确的显示日期和时间

 当在Excel单元格中键入日期或时间时,它会以默认的日期和时间格式显示.默认的日期和时间基于在 Windows 控制面板中指定的区域日期和时间设置,并会随着这些设置的更改而更改.可以用几种其他日期和时间格式(其中大多数不受"控制面板"设置的影响)来显示数字. 1.选择要设置格式的单元格. 2.在"开始"选项卡上,单击"数字"旁边的"对话框启动器". 3.在"分类"列表中,单击"日期"或

在 Go 语言中增强 Cookie 的安全性

本文讲的是在 Go 语言中增强 Cookie 的安全性, 原文地址:Securing Cookies in Go 原文作者:Jon Calhoun 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m- 译者:lsvih 校对者:tmpbook, Yuuoniy 在我开始学习 Go 语言时已经有一些 Web 开发经验了,但是并没有直接操作 Cookie 的经验.我之前做过 Rails 开发,当我不得不需要在 Rails 中读写 Cookie 时,并不需要自己去实现各

让你提前认识软件开发(19):C语言中的协议及单元测试示例

第1部分 重新认识C语言 C语言中的协议及单元测试示例   [文章摘要]         在实际的软件开发项目中,经常要实现多个模块之间的通信,这就需要大家约定好相互之间的通信协议,各自按照协议来收发和解析消息.        本文以实际的程序代码为例,详细介绍了如何用C语言来实现通信协议,并基于对协议字段的判断,说明了程序单元测试的过程,为相关的开发工作提供了有益的参考. [关键词]        软件开发  协议  单元测试  C语言  字段   一.软件模块之间的协议         什么

让你提前认识软件开发(18):C语言中常用的文件操作函数总结及使用方法演示代码

第1部分 重新认识C语言 C语言中常用的文件操作函数总结及使用方法演示代码           在C语言中,有关文件操作的函数多达数十种,但并非每个函数都经常会被用到.        本文对实际软件开发项目中常用的C文件操作函数的用法进行了总结,并用实际的C代码来演示了它们的用法.   1. C语言中常用的文件操作函数总结 (1) fopen 作用:打开文件. 表头文件:#include <stdio.h> 定义函数:FILE *fopen(const char *path, const ch

详解易语言中的数据类型_易语言

各种数据存放在磁盘或内存中都有其不同的存放格式,因此就存在不同的数据类型.了解各种数据的特性,对编程开发来说是十分重要. 程序中经常会进行一些运算,易语言中的运算都要使用运算符进行识别处理,并通过运算表达式来完成运算操作.程序中对各数据之间的关系的描述也要通过运算符. 1.易语言的数据类型 一个程序内部应包括两个方面的内容:1.数据的描述.2.操作步骤,即对程序动作的描述. 数据是程序操作的对象,操作的结果会改变数据的内容.打个比方:要做一道菜,做菜前先选择烹饪的原材料(即对数据进行描述),然后

指针-c语言中字符数组初始化问题

问题描述 c语言中字符数组初始化问题 字符数组初始化1: char str[]=""123"";//不报错2: char str[4]; str=""123"";//不能将const char[4] to char[4]字符指针初始化1: char *str=""123"";//不报错2: char *str; str=""123"";//不报错求

c语言中 如何让7/3的结果输出2.3

问题描述 c语言中 如何让7/3的结果输出2.3 c语言中 如何让7/3的结果输出2.3.初学者求教 在线等 解决方案 #include <stdio.h> int main() { printf("%.1f",7/(float)3); } 解决方案二: printf("%.1f", 1.0 * 7 / 3); 解决方案三: printf("%f",((float)7/3)); 解决方案四: printf("%.2f&quo

c语言中怎么把一个大小不确定的二维数组当作参数传入函数中

问题描述 c语言中怎么把一个大小不确定的二维数组当作参数传入函数中 c语言中怎么把一个大小不确定的二维数组当作参数传入函数中,取大神,取大神,取大神 解决方案 用VC++新建一个程序,默认生成的main函数定义如下 int mian(int argc, char* args[]) 这就是一个例子. 解决方案二: 一个表示长度的参数,一个指向二维数组的指针 解决方案三: fun(args[][],int rows,int cols) 解决方案四: void Func(int array[][10]