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

简介: 一、问题描述 在Linux下编写一C程序,用于获取当前时间到1970年之前某年份的秒数。二、C代码实现/********************************************************************** 版权所有 (C)2015, Zhou Zhaoxiong。

一、问题描述
在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,请扫描以下二维码:
这里写图片描述

目录
相关文章
|
2月前
|
安全 Linux 网络安全
Linux使用HTTP隧道代理代码示例模版
Linux使用HTTP隧道代理代码示例模版
20 0
|
3月前
|
自然语言处理 数据挖掘 Linux
ModelScope问题之拷贝到内网linux系统运行代码报错如何解决
本合集将提供ModelScope安装步骤、配置要求和环境准备,以便用户顺利启动ModelScope进行模型开发和测试。
72 0
|
2月前
|
Linux 编译器 程序员
【Linux 调试秘籍】深入探索 C++:运行时获取堆栈信息和源代码行数的终极指南
【Linux 调试秘籍】深入探索 C++:运行时获取堆栈信息和源代码行数的终极指南
81 0
|
4月前
|
消息中间件 Kubernetes NoSQL
Linux时间校准(ntpdate及NTP客户端代码校准示例)
Linux时间校准(ntpdate及NTP客户端代码校准示例)
|
5月前
|
Linux C语言
在Linux中使用gcc/g++编译代码
1.方法速记 直接编译语法:将text.c文件或者text.cpp文件直接编译成text文件。 gcc text.c -o text // gcc-o text.c text g++ text.cpp -o text // g++ text.cpp -o text
45 0
|
2月前
|
安全 Linux 开发者
⭐⭐⭐⭐⭐Linux C/C++ 进程崩溃诊断以及有效数据收集:解锁代码问题快速定位与修复的方法
⭐⭐⭐⭐⭐Linux C/C++ 进程崩溃诊断以及有效数据收集:解锁代码问题快速定位与修复的方法
90 1
|
3天前
|
存储 安全 算法
【Linux | C++ 】基于环形队列的多生产者多消费者模型(Linux系统下C++ 代码模拟实现)
【Linux | C++ 】基于环形队列的多生产者多消费者模型(Linux系统下C++ 代码模拟实现)
17 0
|
3天前
|
算法 Linux 数据安全/隐私保护
【Linux | C++ 】生产者消费者模型(Linux系统下C++ 代码模拟实现)
【Linux | C++ 】生产者消费者模型(Linux系统下C++ 代码模拟实现)
9 0
|
9天前
|
Linux Shell 调度
【Linux系列】fork( )函数原理与应用详解——了解【父子进程及其特性】(代码演示,画图帮助理解,思维导图,精简)(11)
【Linux系列】fork( )函数原理与应用详解——了解【父子进程及其特性】(代码演示,画图帮助理解,思维导图,精简)(11)
|
11天前
|
安全 Unix Linux
Linux:开源之美与代码之韵
Linux:开源之美与代码之韵
21 1