Linux下获取当前时间到1970年之前某年份的秒数的C代码实现

一、问题描述
在Linux下编写一C程序,用于获取当前时间到1970年之前某年份的秒数。

二、C代码实现

/*********************************************************************
* 版权所有 (C)2015, Zhou Zhaoxiong。
*
* 文件名称:GetSecNumBetweenTwoYear.c
* 文件标识:无
* 内容摘要:获取当前时间到1970年之前某时间的秒数
* 其它说明:无
* 当前版本:V1.0
* 作    者:Zhou Zhaoxiong
* 完成日期:20150211
*
*********************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef unsigned short int  UINT16;
typedef signed   int        INT32;
typedef unsigned int        UINT32;

UINT32 GetSecNumBetweenTwoYear(UINT16 iFirstYear, UINT16 iSecondYear);
INT32 main();

/*********************************************************************
* 功能描述:主函数
* 输入参数:无
* 输出参数:无
* 返 回 值:无
* 其它说明:无
* 修改日期         版本号       修改人            修改内容
* -------------------------------------------------------------------
* 20150211        V1.0     Zhou Zhaoxiong        创建
*********************************************************************/
INT32 main()
{
    UINT32 iYearBefore1970 = 0;
    UINT32 iSecondsTo1970  = 0;
    UINT32 iTotalSeconds   = 0;

    // 先输入一个1970年之前的年份
    printf("Please input a year before 1970: \n");
    scanf("%d", &iYearBefore1970);
    if (iYearBefore1970 >= 1970)    // 确保输入时间小于1970
    {
        printf("The year %d isn't less than 1970, please check!\n", iYearBefore1970);
        return -1;
    }

    // 计算输入年份到1970年的秒数
    iSecondsTo1970 = GetSecNumBetweenTwoYear(iYearBefore1970, 1970);
    printf("The total seconds from %d to 1970 is: %u\n", iYearBefore1970, iSecondsTo1970);

    // 计算总的秒数
    iTotalSeconds = (UINT32)(time(0) + (time_t)iSecondsTo1970);
    printf("The total seconds from %d to now is: %u\n", iYearBefore1970, iTotalSeconds);

    return 0;                  // main函数返回0
}

/**********************************************************************
* 功能描述: 计算任意两年之间的秒数
* 输入参数: iFirstYear-减数
            iSecondYear-被减数
* 输出参数: 无
* 返 回 值: 秒数
* 其它说明: 无
* 修改日期         版本号          修改人          修改内容
* --------------------------------------------------------------------
* 20150211         V1.0      Zhou Zhaoxiong        创建
*********************************************************************/
UINT32 GetSecNumBetweenTwoYear(UINT16 iFirstYear, UINT16 iSecondYear)
{
    UINT32 iTotalDays = 0;      // 两年之间的总天数
    UINT16 iTmpYear   = 0;      // 用作临时存放中间数据

    // 输入参数检查, 保证减数小于被减数
    if (iFirstYear > iSecondYear)
    {
        iTmpYear    = iFirstYear;
        iFirstYear  = iSecondYear;
        iSecondYear = iTmpYear;
    }

    // 计算总天数
    iTotalDays = 0;

    for (iTmpYear = iFirstYear; iTmpYear < iSecondYear; iTmpYear ++)
    {
        // 判断该年天数:1-能被4整除,但不能被100整除的是闰年; 2-能被400整除的是闰年
        if ((0 == (iTmpYear%4) && 0 != (iTmpYear%100)) ||
             0 == (iTmpYear%400))
        {
            iTotalDays += 366;    // 闰年
        }
        else
        {
            iTotalDays += 365;    // 平年
        }
    }

    return iTotalDays * 86400;    // 总的秒数
}

三、makefile文件内容

GetSecNumBetweenTwoYear : GetSecNumBetweenTwoYear.c
    gcc -c -g GetSecNumBetweenTwoYear.c
    gcc -g -o release/GetSecNumBetweenTwoYear GetSecNumBetweenTwoYear.o
    rm *.o

四、程序说明
(1) 在Linux下,有一个函数time用户获取时间,但时间的起点是从1970年开始的,因此本程序获取的时间分为两段:输入时间到1970年的时间和1970年到当前的时间。输入时间到1970年的时间用自编的函数获取,1970年到当前的时间用time(0)获取。
(2) 打印获取到的秒数的时候,要用“%u”格式;如果采用“%d”格式,则会出现整型值溢出的情况,打印出负值。

五、程序运行结果
运行“make”命令之后,转到“release”目录下,执行“GetSecNumBetweenTwoYear”,结果如下:
(1) 正常用例

release> GetSecNumBetweenTwoYear
Please input a year before 1970:
1900
The total seconds from 1900 to 1970 is: 2208988800
The total seconds from 1900 to now is: 3632613008

release> GetSecNumBetweenTwoYear
Please input a year before 1970:
1910
The total seconds from 1910 to 1970 is: 1893456000
The total seconds from 1910 to now is: 3317080221

(2) 异常用例

release> GetSecNumBetweenTwoYear
Please input a year before 1970:
1990
The year 1990 isn't less than 1970, please check!


本人微信公众号:zhouzxi,请扫描以下二维码:

时间: 2024-08-01 11:42:11

Linux下获取当前时间到1970年之前某年份的秒数的C代码实现的相关文章

Linux下获取代码文件名、代码所在行数及日期时间的C程序实现

一.概述 在实际的软件开发项目中,为了方便排查程序问题,要求在日志文件中输出日志信息所在的程序文件名及日志代码所在的行数.此外,某些软件还会要求将程序启动时的日期时间输出到日志文件中,方便跟踪软件运行状况. 本文介绍了Linux下获取代码文件名.代码行数及日期时间的C代码实现. 二.几个标准预定义宏简介 在C语言中,使用几个标准预定义宏,便可轻松实现获取代码文件名.代码行数及日期时间的功能. 这几个宏的定义如下(注意:前后都是两条连续的下划线): __FILE__:在源文件中插入当前源文件名.

Linux下时区与时间设置方法

首先要说明的是我的系统是fedora,其他系统可能不完全相同. 1,时间保存在硬件实时钟(RTC)中,RTC由主板电池供电,即使关断电源也不会造成时间丢失. 2,系统启动时从RTC获取时间,这个步骤在rc.sysinit中做: a,首先从/etc/sysconfig/clock中获取RTC相关参数UTC/ARC/SRM.UTC为true表示RTC保存的时间是UTC时间,false表示保存的是本地时间.ARC与SRM的含义参考hwclock的manpage,一般false即可: b,根据上面获取的

Linux下获取用户主目录的方法分享

  Linux下获取用户主目录的方法分享     方法如下 char *path = getenv("HOME"); printf("path = %sn",path); getenv是标准库函数,包含stdlib.h头文件就可.

Dos下获取系统时间的代码

dos下获取系统时间的实现代码,需要的朋友可以参考下   复制代码 代码如下:   rem DOS get current time  rem =======================  rem get yyyy/mm/dd  set mydate=%DATE:~0,10%  echo %mydate%  rem =======================  rem get yyyy  set yyyy=%DATE:~0,4%  echo %yyyy%  rem ===========

Linux 下获取LAN中指定IP的网卡的MAC(物理地址)

// all.h// 2005/06/20,a.m. wenxy #ifndef _ALL_H#define _ALL_H #include <memory.h>#include <stdio.h>#include <stdlib.h>#include <sys/ioctl.h>#include <sys/types.h>#include <sys/socket.h>#include <net/if.h>#include

基于linux下获取时间函数的详解_C 语言

//-------------------------------------------------------------//asctime(将时间和日期以字符串格式表示)#include<time.h>定义函数char * asctime(const struct tm * timeptr);函数说明asctime()将参数timeptr所指的tm结构中的信息转换成真实世界所使用的时间日期表示方法,然后将结果以字符串形态返回.此函数已经由时区转换成当地时间,字符串格式为:"We

linux下获取硬盘使用情况[总结]

1.前言 在嵌入式设备中,硬盘空间非常有限,在涉及到经常写日志的进程时候,需要考虑日志的大小和删除,不然很快就硬盘写满,导致日志程序崩溃.为了捕获硬盘写满的异常场景,我们需要在写日志过程中判断硬盘空间的使用情况,根据硬盘的使用情况,就可以判断是否写满了.如果将要写满了,就给出警告.这样就可以避免程序崩溃.首先看一下linux获取硬盘和目录大小的命令,最后总结一下statfs结构和函数. 2.df命令 Linux下可以用df命令获取硬盘的使用情况,通过man可以获取df命令的详细情况.df命令经常

如何在windows下和linux下获取文件(如exe文件)的详细信息和属性

程序员都很懒,你懂的! 最近在项目开发中,由cs开发的exe的程序,需要自动升级,该exe程序放在linux下,自动升级时检测不到该exe程序的版本号信息,但是我们客户端的exe程序需要获取服务器上新程序的版本号信息.最后由我用java实现linux上exe文件的版本号读取功能.下面是详细代码: package com.herman.utils; import java.io.File; import java.io.FileNotFoundException; import java.io.I

(总结)Linux下获取详细硬件信息的工具:Dmidecode命令详解

Dmidecode 这款软件允许你在 Linux 系统下获取有关硬件方面的信息.Dmidecode 遵循 SMBIOS/DMI 标准,其输出的信息包括 BIOS.系统.主板.处理器.内存.缓存等等.偶发现这个工具很有用,就总结一下. 一.DMI简介: DMI (Desktop Management Interface, DMI)就是帮助收集电脑系统信息的管理系统,DMI信息的收集必须在严格遵照SMBIOS规范的前提下进行. SMBIOS(System Management BIOS)是主板或系统