time_t

The most basic representation of a date and time is the type time_t. The value of a time_t variable is the number of seconds since January 1, 1970, sometimes call the Unix epoch. This is the best way to internally represent the start and end times for an event because it is easy to compare these values. Two time_t values a and b can be compared using <:

if(a < b)
{
printf("Time a is before time b\n");
}
struct tm

While time_t represents a date and time as a single number, struct tm represents it as a struct with a lot of numbers:

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]*/
};
Conversion

You can convert a time_t value to a struct tm value using the localtime function:

struct tm startTM;
time_t start; /* ... */ startTM = *localtime(&start);

You can convert a struct tm value to a time_t value using the mktime function:

struct tm startTM;
time_t start; /* ... */ start = mktime(&startTM);
How to input a date

Your program will need to input a date. Here is an example of a safe and robust way to input a date:

time_t InputDate(char *prompt)
{
char buffer[100];
char *result;
struct tm date; do
{
printf("%s", prompt); /* Get a line of up to 100 characters */
fgets(buffer, sizeof(buffer), stdin); /* Remove any \n we may have input */
if(strlen(buffer) > 0)
buffer[strlen(buffer)-1] = '\0'; result = strptime(buffer, "%m/%d/%Y", &date); } while(result == NULL); /* Convert to time_t format */
date.tm_min = 0;
date.tm_hour = 0;
date.tm_sec = 0;
date.tm_isdst = 1; return mktime(&date);
}

This function asks the user for a time with the given prompt. If the time is correctly entered, it converts it to type time_t, expressing a time and date of 12:00am on the entered date.

In order to use the strptime function, you will need to #include <time.h>. However, you must preceed the #include with this code:

#define __USE_XOPEN
#include <time.h>

Any time you #include <time.h> in your program, use the line #define __USE_XOPEN before it. Note that it begins with two underlines.

How to input a time

After entering the date, you can enter a time using this safe and robust function:

time_t InputTime(char *prompt, time_t date)
{
char buffer[100];
char *result;
struct tm time; time = *localtime(&date); do
{
printf("%s", prompt); /* Get a line of up to 100 characters */
fgets(buffer, sizeof(buffer), stdin); /* Remove any \n we may have input */
if(strlen(buffer) > 0)
buffer[strlen(buffer)-1] = '\0'; result = strptime(buffer, "%I:%M%p", &time); } while(result == NULL); return mktime(&time);
}

This function is passed a date expressed as a time_t value, the output of the InputDate function. The time is entered and added to the date to produce a date and time value that is returned. Here is an example of how these functions can be used to input a date, start time, and end time.

time_t date;
time_t start;
time_t end; /*...*/ date = InputDate("Event date: ");
start = InputTime("Start time: ", date);
end = InputTime("End time: ", date);
How to output a time_t value.

To output a time or date, you convert it to a struct tm:

struct tm startTM;
time_t start; /* ... */ startTM = *localtime(&start);

Once converted, the value in struct tm are:

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]*/
};

Now I can get the hour in the example as startTM.tm_hour. There are a couple strange things about this struct. To get the actual year, use startTM.tm_year + 1900.  To get the actual month number, use startTM.tm_mon + 1.

The function ctime

The function ctime converts a time_t value into a string of the following form:

Thu Apr 14 14:00:00 2011

This is a handy way to test to see if a time is what you expect. For example, if I have a variable: time_t timeDate and want to know what its value is, I can add this code while debugging:

printf("The date/time is %s\n", ctime(&timeDate));

This is also the easiest way to save the start date/time and end date/time to a file.

Reading the output of ctime

To read the output of ctime from a file and convert it back to a time_t value, use this code:

struct tm tim;
time_t startTime; fgets(buffer, sizeof(buffer), file);
strptime(buffer, "%a %b %d %H:%M:%S %Y", &tim);
startTime = mktime(&tim);

This inputs the date/time string from a file into the character string buffer. It then used strptime to convert it to a struct tm structure. Then the funciton mktime converts the struct tm value to a time_t value.

c 语言时间的输出和比较的更多相关文章

  1. YTU 2416: C语言习题 成绩输出

    2416: C语言习题 成绩输出 时间限制: 1 Sec  内存限制: 128 MB 提交: 1111  解决: 417 题目描述 输入n(<=10)个学生的姓名.学号和成绩,将其中不及格者的姓 ...

  2. C 语言 时间函数使用技巧(汇总)

    time.h 头文件 是 C 语言中 有关 时间的函数所储存的头文件 #include <time.h> 在介绍时间函数用法之前,我们首先要了解在 time.h 头文件中已经声明了的一个结 ...

  3. ls按时间排序输出文件列表

    文件转自:http://www.2cto.com/os/201303/197829.html ls按时间排序输出文件列表   首先,ls --help查看ls相关的与时间排序相关的参数:   > ...

  4. [转]C语言文件输入/输出ACM改进版(freopen函数)

    C语言文件输入/输出ACM改进版(freopen函数) 2009年5月27日 10:379,457 浏览数发表评论阅读评论   文章作者:姜南(Slyar) 文章来源:Slyar Home (www. ...

  5. C语言中格式化输出的转换说明的fldwidth和precision解析

    首先说什么是C语言的格式化输出,就是printf和它的几个变种(grep -E "v?(sn|s|f)printf").像这些函数都有一个参数format,format中可以加点转 ...

  6. Python中日期和时间格式化输出的方法

    本文转自:https://www.jb51.net/article/62518.htm 本文实例总结了python中日期和时间格式化输出的方法.分享给大家供大家参考.具体分析如下: python格式化 ...

  7. C 语言实例 - 循环输出26个字母

    C 语言实例 - 循环输出26个字母 循环输出 个字母. 实例 #include <stdio.h> int main() { char c; for(c = 'A'; c <= ' ...

  8. go语言时间函数

    以YY-mm-dd HH:MM:SS.9位 输出当前时间: func main() { fmt.Println(time.Now()) // 2019-11-15 16:26:12.4807588 + ...

  9. C语言 · 时间转换

    问题描述 给定一个以秒为单位的时间t,要求用"<H>:<M>:<S>"的格式来表示这个时间.<H>表示时间,<M>表示分 ...

随机推荐

  1. Android 新浪微博代码

    新浪微博开发 [代码] android Weibo weibo=new Weibo(); weibo.setUserId("sdhjob@hotmail.com"); weibo. ...

  2. android开发环境 eclipse + android sdk配置笔记

    本开发环境为:eclipse + android sdk,步骤说明的顺序,没有特别要求,看个人爱好了 步骤说明: 1.安装eclipse 2.配置jdk 3.安装android sdk 4.安装ADT ...

  3. TP复习4

    <script> window.onload=function(){ if(<{$data.sex}>==0){ document.getElementsByName('sex ...

  4. [AngularJS] Accessing Scope from The Console

    Using Angular, you can actually access the scope and other things from the console, so when you have ...

  5. Linux的内存回收和交换

    Linux的内存回收和交换 版权声明: 本文章内容在非商业使用前提下可无需授权任意转载.发布. 转载.发布请务必注明作者和其微博.微信公众号地址,以便读者询问问题和甄误反馈,共同进步. 微博ID:or ...

  6. fs/ext2/inode.c相关函数注释

    用数组chain[4]描述四种不同的索引,即直接索引.一级间接索引.二级间接索引.三级间接索引.举例说明这个结构各个域的含义.如果文件内的块号为8,则不需要间接索引,所以只用chain[0]一个Ind ...

  7. Google 推出全新的两步验证机制

    近日 Google 在官方的 Apps Updates 博客公布了全新的两步验证功能--Google 提示,新的功能通过与 Google App 联动,进一步将验证确认工作缩减到仅有两步,同时支持 A ...

  8. LeetCode29 Divide Two Integers

    题目: Divide two integers without using multiplication, division and mod operator. If it is overflow, ...

  9. 短小实用 渗透用的Python小脚本

    渗透的很多时候,找到的工具并不适用,自己码代码才是王道,下面三个程序都是渗透时在网络上找不到合适工具,自己辛苦开发的,短小实用. 一.记录root密码小工具 root.py #!/usr/bin/py ...

  10. SQL Server 的事务和锁(二)-Range S-S锁

    在这篇随笔中,我们的主要关注点在 Key-Range Lock.Key-Range Lock有 S-S.S-U.I-N.X-X几种情况.我们一个一个来说,力求明白.遗憾的是,这里可能会比较冗长,那么死 ...