c 语言时间的输出和比较
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 语言时间的输出和比较的更多相关文章
- YTU 2416: C语言习题 成绩输出
2416: C语言习题 成绩输出 时间限制: 1 Sec 内存限制: 128 MB 提交: 1111 解决: 417 题目描述 输入n(<=10)个学生的姓名.学号和成绩,将其中不及格者的姓 ...
- C 语言 时间函数使用技巧(汇总)
time.h 头文件 是 C 语言中 有关 时间的函数所储存的头文件 #include <time.h> 在介绍时间函数用法之前,我们首先要了解在 time.h 头文件中已经声明了的一个结 ...
- ls按时间排序输出文件列表
文件转自:http://www.2cto.com/os/201303/197829.html ls按时间排序输出文件列表 首先,ls --help查看ls相关的与时间排序相关的参数: > ...
- [转]C语言文件输入/输出ACM改进版(freopen函数)
C语言文件输入/输出ACM改进版(freopen函数) 2009年5月27日 10:379,457 浏览数发表评论阅读评论 文章作者:姜南(Slyar) 文章来源:Slyar Home (www. ...
- C语言中格式化输出的转换说明的fldwidth和precision解析
首先说什么是C语言的格式化输出,就是printf和它的几个变种(grep -E "v?(sn|s|f)printf").像这些函数都有一个参数format,format中可以加点转 ...
- Python中日期和时间格式化输出的方法
本文转自:https://www.jb51.net/article/62518.htm 本文实例总结了python中日期和时间格式化输出的方法.分享给大家供大家参考.具体分析如下: python格式化 ...
- C 语言实例 - 循环输出26个字母
C 语言实例 - 循环输出26个字母 循环输出 个字母. 实例 #include <stdio.h> int main() { char c; for(c = 'A'; c <= ' ...
- go语言时间函数
以YY-mm-dd HH:MM:SS.9位 输出当前时间: func main() { fmt.Println(time.Now()) // 2019-11-15 16:26:12.4807588 + ...
- C语言 · 时间转换
问题描述 给定一个以秒为单位的时间t,要求用"<H>:<M>:<S>"的格式来表示这个时间.<H>表示时间,<M>表示分 ...
随机推荐
- javascript代码解释执行过程
javascript是由浏览器解释执行的脚本语言,不同于java c,需要先编译后运行,javascript 由浏览器js解释器进行解释执行,总的过程分为两大块,预编译期和执行期 下面的几个demo解 ...
- 小白日记45:kali渗透测试之Web渗透-SqlMap自动注入(三)-sqlmap参数详解-Optimization,Injection,Detection,Techniques,Fingerprint
sqlmap自动注入 Optimization [优化性能参数,可提高效率] -o:指定前三个参数(--predict-output.--keep-alive.--null-connection) - ...
- BootStrap2学习日记22---点击展开
先看效果: Code: <div class="accordion" id="accordion2"> <div class="ac ...
- 属性通知之INotifyPropertyChanged
为什么后台绑定的值改变了前台不发生变化了? 针对这个初学者很容易弄错的问题,这里介绍一下INotifyPropertyChanged的用法 INotifyPropertyChanged:用于绑定属性更 ...
- Spring mvc编码配置
Spring3 MVC也带有自己的编码: jar包:org.springframework.web-3.0.0.RELEASE.jar 只需要在web.xml配置即可: <!-- spring ...
- java笔记 chapter1 java是什么,能干什么,有什么,特点,开发环境
一,java是什么 二,java能干什么 三,java有什么 四,java的特点 五,java的三大特性:虚拟机,垃圾回收和代码安全 六,构建JSE开发环境:下载安装jdk和配置环境变量 七,编写并运 ...
- Flask-在浏览器中直接显示文本文件中的内容
目录结构: project├── info.json├── run.py└── static └── readme.txt # 直接返回static目录下的文件内容 @app.route( ...
- Ios入门
storyboard 文件的认识 用来描述软件界面 默认情况下程序启动就会加载Main.storyboard 加载storyboard时,会首先创建和显示箭头所指向的控制器界面 什么是UIscroll ...
- IIS与JIRA的反向代理配置
JIRA配置修改 JIRA与IIS ARR的集成,除了上篇(Visual SVN IIS反向代理设置)中讲到的基本的ARR配置之外,还需要在JIRA安装目录的conf\server.xml文件中做一个 ...
- SQL Server 2008数据类型
在创建表时,必须为表中的每列指派一种数据类型. 今天在研究二进制存储图片时候竟然不知道image类型就是二进制类型?!所有就搜集了sql中的各种数据类型汇总,成功在于点滴积累. 1. 字符数据类型 数 ...