C语言中时间的基本用法小结

前言

在我学的这些编程语言中,总是记不住它们的时间处理方式,每次用到时都要重新看,所以想着在这里记录下来,也方便用到时查找,也方便有需要的朋友们参考。

time_t和struct tm

在C语言中用time_t类型表示一个时间,通常它是一个和long一样长的整数,也就是说,在32位环境下,它是4字节,在64位环境下,它是8字节。它保存的就是一个整数值,表示了从1970-01-01 08:00:00到其所表示时间的秒数,它是一个非负整数,所以,time_t无法表示早于1970-01-01 08:00:00的时间。

一个很常用的函数就是time_t time(time_t *_v) ,它的参数是一个time_t类型的指针,返回一个和传入参数相等的time_t类型值。如果time()函数的参数是0,则返回当前的时间。

现在我们已经能用C语言表示一个时间了,但是这个时间只是从某个时间开始的秒数,如何表示更详细的时间细节呢?这就要用到struct tm类型了,它可以表示更具体的时间信息。

它一个结构体,我们就先看一下它的成员信息,一个struct tm类型包括以下成员:

  • int tm_year表示时间的年份,它的值从1900年开始算起,也就是说当其值为1的时候,表示的是1901年。因为time_t类型表示的时间范围不早于1970年,所以这个值通常不小于70。
  • int tm_mon表示时间是几月,它的值是0到11,0表示的是一月,而11表示的是12月。
  • int tm_mday表示时间是当前月的几号,其值的范围自然是根据月份不同也不相同。
  • int tm_wday表示时间是星期几,它的值的范围是0到6,0是星期天,1是星期一,6是星期六。
  • int tm_yday表示时间是当前年的第几天,要注意的是1月1号是第0天。
  • int tm_hour表示时间是几时。
  • int tm_min表示时间是几分。
  • int tm_sec表示时间是几秒。
  • int tm_isdst表示是否是夏令时。

localtime()

如何把一个time_t类型构造成struct tm类型呢?用struct tm *localtime(const time_t *_v)函数即可,注意参数和返回值都是指针类型。

#include <stdio.h>
#include <time.h>

int main()
{
 time_t tt = time(0); //获取当前时间
 struct tm *pst = localtime(&tt); //把time_t类型转换为struct tm类型
 printf("The year is %d.\n", pst->tm_year + 1900); //别忘了要加1900

 return 0;
}

上述程序输出:

The year is 2016.

mktime()

那么如何把struct tm类型转换为time_t类型呢?就用time_t mktime(struct tm *_v)函数,注意参数是指针类型。

那么如何输出时间呢?可以简单的使用char *ctime(time_t *_v)函数和char *asctime(struct tm *_v)函数,要注意的是返回的字符串结尾包含换行符\n。

#include <stdio.h>
#include <time.h>

int main()
{
 struct tm st;
 st.tm_year = 2016 - 1900;
 st.tm_mon = 8;
 st.tm_mday = 13;
 st.tm_hour = 16;
 st.tm_min = 30;
 st.tm_sec = 0;
 st.tm_isdst = 0;
 time_t tt = mktime(&st);
 printf("%s", asctime(&st));
 printf("%s", ctime(&tt));

 return 0;
}

上述程序输出:

Tue Sep 13 16:30:00 2016
Tue Sep 13 16:30:00 2016

我们自己用struct tm构造了一个时间,并且在执行mktime()函数后,tm_wday属性也会自动计算出来。

clock()

在time.h中,还有一些其他很常用的函数,比如clock_t clock()函数,clock_t也是一个整数,是typedef long clock_t;得来的。这个函数返回程序运行到这条语句所消耗的时间。单位一般是毫秒,可以通过printf("%d\n", CLOCKS_PER_SEC);这样确定,若输出1000,则证明是毫秒。

我们可以方便的用它来计算程序某一段语句所消耗的时间:

#include <stdio.h>
#include <time.h>

int main()
{
 int i = 0;

 printf("CLOCKS_PER_SEC: %ld\n", CLOCKS_PER_SEC);

 long c = clock();
 while(i < 1<<30) i++;
 printf("The while loop cost %ld.\n", clock() - c);

 c = clock();
 for(i = 0; i < 1<<30; i++);
 printf("The for loop cost %ld.\n", clock() - c);

 return 0;
}

上述程序输出:

CLOCKS_PER_SEC: 1000
The while loop cost 2234.
The for loop cost 2206.

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者使用C语言能带来一定的帮助,如果有疑问大家可以留言交流。

(0)

相关推荐

  • C语言代码中调用C++代码的方法示例

    由于历史原因,以及不同开发人员的技术偏好,C语言和C++语言都有一些独有的非常有价值的项目,因而两种语言的互操作,充分利用前人造的轮子是一件非常有价值的事情. C++代码调用C代码很简单,只要分别在包含的C头文件的开头和结尾加上如下的两个块: #ifdef __cplusplus extern "C" { #endif 和 #ifdef __cplusplus } #endif 即可. 然而为了支持类.重载等更加高级的特性,在编译C++代码时,C++符号会被修饰.我们dump Linu

  • C语言中函数参数的入栈顺序详解及实例

    C语言中函数参数的入栈顺序详解及实例 对技术执着的人,比如说我,往往对一些问题,不仅想做到"知其然",还想做到"知其所以然".C语言可谓博大精深,即使我已经有多年的开发经验,可还是有许多问题不知其所以然.某天某地某人问我,C语言中函数参数的入栈顺序如何?从右至左,我随口回答.为什么是从右至左呢?我终究没有给出合理的解释.于是,只好做了个作业,于是有了这篇小博文. #include void foo(int x, int y, int z) { printf(&quo

  • C语言 strcpy和memcpy区别详细介绍

    C语言 strcpy和memcpy区别详细介绍 PS:初学算法,开始刷leetcode,Rotate array的预备知识(写的代码Time Limit Exceed难过)于是百度高效算法,本篇作为预备知识. 1.strcpy和strncpy函数 这个不陌生,大一学C语言讲过,其一般形式为strcpy(字符数组1,字符串2)作用是将字符串2复制到字符数组1中去. EX: char str1[10]='',str2[]={"China"}; strcpy(str1,str2); strn

  • C语言 全局变量和局部变量详解及实例

    C语言 全局变量和局部变量详解 核心内容: 1.局部变量和全局变量 变量按照作用域分为:全局变量和局部变量 全局变量的作用域:从定义位置开始到下面整个程序结束. 局部变量的作用域:在一个函数内部定义的变量只能在本函数内部进行使用. OK,上面的效果用Java语言实现一下: public class App1 { public static int k = 10;//相当于全局变量 public static void main(String[] args) { int i = 10;//局部变量

  • C语言基础知识变量的作用域和存储方式详细介绍

    变量的作用域和存储方式 1.简述变量按作用域的分类 变量按作用域分:分为全局变量和局部变量 全局变量:在所有函数外部定义的变量叫做全局变量 全局变量的使用范围:从定义位置开始到下面整个程序结束 局部变量:在一个函数内部定义的变量或者函数的形式参数统称为局部变量 局部变量的使用范围:在函数内部定义的变量只能在本函数内部进行使用 2.简述变量按存储方式的分类 静态变量 自动变量 寄存器变量[寄存器就是cpu内部可以存储数据的一些硬件东西] 3.简述全局变量和局部变量命名冲突的问题 1>在一个函数内部

  • 详解C语言中的字符串拼接(堆与栈)

    首先来看一个demo: int do_sth(int type) { char *errstr; switch(type) { case 1: errstr = "Error";break case 2: errstr = "Warn";break case 3: errstr = "Info";break case 4: errstr = "Debug";break default: return 0; } if (...)

  • C语言 坐标移动详解及实例代码

    题目描述 开发一个坐标计算工具, A表示向左移动,D表示向右移动,W表示向上移动,S表示向下移动.从(0,0)点开始移动,从输入字符串里面读取一些坐标,并将最终输入结果输出到输出文件里面. 输入: 合法坐标为A(或者D或者W或者S) + 数字(两位以内) 坐标之间以;分隔. 非法坐标点需要进行丢弃.如AA10;  A1A;  $%$;  YAD; 等. 下面是一个简单的例子 如: A10;S20;W10;D30;X;A1A;B10A11;;A10; 处理过程: 起点(0,0) + A10 = (

  • C语言 实现遍历一个文件夹的所有文件

    C语言 实现遍历一个文件夹的所有文件 最近学习C语言基础知识,有一个需求是需要遍历文件夹中的文件,对与这种很好实现,然后自己做了一个遍历所有文件的实现代码,做下记录: 实现代码: #include <stdio.h> #include <io.h> int main (void) { _finddata_t fileDir; long lfDir; if((lfDir = _findfirst(dir,&fileDir))==-1l) printf("No fil

  • C语言 设计模式之访问者模式

    C语言访问者模式 概要: 访问者模式,听上去复杂一些.但是,这种模式用简单的一句话说,就是不同的人对不同的事物有不同的感觉.比如说吧,豆腐可以做成麻辣豆腐,也可以做成臭豆腐.可是,不同的地方的人未必都喜欢这两种豆腐.四川的朋友可能更喜欢辣豆腐,江浙的人就可能对臭豆腐更喜欢一些.那么,这种情况应该怎么用设计模式表达呢? typedef struct _Tofu { int type; void (*eat) (struct _Visitor* pVisitor, struct _Tofu* pTo

  • C语言中时间的基本用法小结

    前言 在我学的这些编程语言中,总是记不住它们的时间处理方式,每次用到时都要重新看,所以想着在这里记录下来,也方便用到时查找,也方便有需要的朋友们参考. time_t和struct tm 在C语言中用time_t类型表示一个时间,通常它是一个和long一样长的整数,也就是说,在32位环境下,它是4字节,在64位环境下,它是8字节.它保存的就是一个整数值,表示了从1970-01-01 08:00:00到其所表示时间的秒数,它是一个非负整数,所以,time_t无法表示早于1970-01-01 08:0

  • C语言中各类指针的用法(小结)

    一.指针的大小 二.野指针和空指针 #include <stdio.h> int main(void) { int a = 6; int* p; p = a;//把a的值赋给指针变量p,p为野指针,这样做不会出现啥问题,但是没什么意义 p = 0x456;//为指针变量p赋值,p为野指针,这样做不会出现啥问题,但是没什么意义 *p = 100;//操作野指针指向未知区域,内存会出问题,报错. return 0; } 但是,野指针和有效指针变量保存的都是数值,为了标志此指针变量没有指向任何变量(

  • C/C++ 中const关键字的用法小结

    C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性. Const作用 NO. 作用 说明 参考 1 可以定义const常量 const int Max = 100; 2 便于进行类型检查 const常量有数据类型,而宏常量没有数据类型.编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误 void f(const int i) { ---} //对传入的参数进行类型检查,不匹配进行提示 3 可以保护被修

  • mybatis 中 foreach collection的用法小结(三种)

    foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合. foreach元素的属性主要有 item,index,collection,open,separator,close. item表示集合中每一个元素进行迭代时的别名,     index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置,     open表示该语句以什么开始,     separator表示在每次进行迭代之间以什么符号作为分隔 符,     close表示以什么结束. 在使用foreach的时候

  • R语言中时间序列分析浅析

    时间序列是将统一统计值按照时间发生的先后顺序来进行排列,时间序列分析的主要目的是根据已有数据对未来进行预测. 一个稳定的时间序列中常常包含两个部分,那么就是:有规律的时间序列+噪声.所以,在以下的方法中,主要的目的就是去过滤噪声值,让我们的时间序列更加的有分析意义. 语法 时间序列分析中ts()函数的基本语法是 timeseries.object.name <- ts(data, start, end, frequency) 以下是所使用的参数的描述 data是包含在时间序列中使用的值的向量或矩

  • C#中AutoResetEvent控制线程用法小结

    目录 AutoResetEvent主要方法及实践 第二种方法Semaphore 第三种方法,约定每个线程只干自己的事 第四种方法 Mutex 本文主要来自一道面试题,由于之前对AutoResetEvent的概念比较模糊(即使已经使用过了).面试题题目很简洁:两个线程交替打印0~100的奇偶数.你可以先动手试试,我主要是尝试在一个方法里面完成这个任务. 注: Suspend,Resume来控制线程已经在.net framework2.0被淘汰了,原因就是挂起之后,但因为异常而没有及时恢复,如果占用

  • Python argparse中的action=store_true用法小结

    目录 Python argparse中的action=store_true用法 前言 示例 官方文档 多了解一点儿 自定义 小结 思考 补充:python库Argparse中的可选参数设置 action=‘store_true‘ 的用法 一.没有default 二.有default Python argparse中的action=store_true用法 前言 Python的命令行参数解析模块学习. 示例 参数解析模块支持action参数,这个参数可以设置为’store_true’.‘store

  • Go语言中的方法定义用法分析

    本文实例讲述了Go语言中的方法定义.分享给大家供大家参考.具体分析如下: 事实上,可以对包中的任意类型定义任意方法,而不仅仅是结构体. 不能对来自其他包的类型或基础类型定义方法. 复制代码 代码如下: package main import (     "fmt"     "math" ) type MyFloat float64 func (f MyFloat) Abs() float64 {     if f < 0 {         return fl

  • JS中闭包的经典用法小结(2则示例)

    本文实例总结了JS中闭包的经典用法.分享给大家供大家参考,具体如下: 闭包这个东西,网上有很多介绍资料.个人看了很多,还是一知半解.这里不做理论介绍,直接给出2个例子. 代码1:记录函数被调用的次数 function a() { var i = 0; function b() { return ++i; } return b; } var c = a(); c();//1 c();//2 这种方式类似C语言中的private static变量,能够保持局部变量的内存不释放. 代码2:正确给DOM

  • 浅析JavaScript中的特殊函数及用法小结

    目录 写在前面 匿名函数 回调函数 自调函数 作为值的函数 写在前面 JavaScript中的函数本质上是一个对象,我们可以将这个对象赋值给一个变量,这就使JavaScript中的函数变得非常的灵活,现在就来浅看一下JavaScript中函数的一些用法. 匿名函数 JavaScript 可以将函数作为数据使用.作为函数本体,它与普通的数据一样,不一定有名字.没有名字的函数被称之为匿名函数. 示例代码如下: //匿名函数 function(){ //匿名函数,会报错 return '一碗周'; }

随机推荐