• C 语言实现 unix 时间戳转换成时间字符串


    2019-05-21

    关键字:时间字符串转换、unix时间戳转换、Android 下 C 语言时间戳转换


    Linux 下使用 C 语言将 unix 时间戳值转换为普通时间字符串是很方便的。但是在 Android 下却不是,主要 Linux 下用于转换时间戳值的相关头文件在 Android 下不存在引起的。所以在 Android 上,能在 Java 层完成时间值的转换就尽量在 Java 层完成。非得要在 Android 下用 C 语言来转换,那只能自己写算法了。

    这篇文章不多唠叨,直接贴一个 Android 4.4 下使用 C 语言将 unix 时间戳值转换成普通时间字符串的代码。

    这里贴的代码为单向转换的,即转换方向为

    1558443421   -->  2019-05-21 12:57:01

    并且,这个转换是不考虑时区的,默认转成 UTC 时间。

    下面是代码

    /*************************************************************************************
    **************************************************************************************
    ************************ unix timestamp to time string [begin] ***********************
    **************************************************************************************
    ***************************************************************************************/
    
    #define UTC_BASE_YEAR   1970
    #define MONTH_PER_YEAR  12
    #define DAY_PER_YEAR    365
    #define SEC_PER_DAY     86400
    #define SEC_PER_HOUR    3600
    #define SEC_PER_MIN     60
    
    /* 每个月的天数 */
    const unsigned char g_day_per_mon[MONTH_PER_YEAR] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    
    /*
     * 功能:
     *     判断是否是闰年
     * 参数:
     *     year:需要判断的年份数
     *
     * 返回值:
     *     闰年返回1,否则返回0
     */
    static unsigned char applib_dt_is_leap_year(unsigned short year)
    {
    
        if ((year % 400) == 0) {
            return 1;
        } else if ((year % 100) == 0) {
            return 0;
        } else if ((year % 4) == 0) {
            return 1;
        } else {
            return 0;
        }
    }
    
    /*
     * 功能:
     *     得到每个月有多少天
     * 参数:
     *     month:需要得到天数的月份数
     *     year:该月所对应的年份数
     *
     * 返回值:
     *     该月有多少天
     *
     */
    static unsigned char applib_dt_last_day_of_mon(unsigned char month, unsigned short year)
    {
        if ((month == 0) || (month > 12)) {
            return g_day_per_mon[1] + applib_dt_is_leap_year(year);
        }
    
        if (month != 2) {
            return g_day_per_mon[month - 1];
        } else {
            return g_day_per_mon[1] + applib_dt_is_leap_year(year);
        }
    }
    
    
    static void change(long ts)
    {
        int year = 0;
        int month = 0;
        int day = 0;
        int hour = 0;
        int minute = 0;
        int second = 0;
    
    
        //将时间戳值转化成天数。通过天数可以比较方便地算出年、月、日。
        int days = ts / SEC_PER_DAY;
        //这个时间戳值的年。
        int yearTmp = 0;
        int dayTmp = 0;
        //使用夹逼法计算 days 天中包含的年数。
        for (yearTmp = UTC_BASE_YEAR; days > 0; yearTmp++) {
            dayTmp = (DAY_PER_YEAR + applib_dt_is_leap_year(yearTmp)); //这一年有多少天?
            if (days >= dayTmp) //条件成立,则 yearTmp 即是这个时间戳值所代表的年数。
            {
               days -= dayTmp;
            }
            else
            {
               break;
            }
        }
        year = yearTmp;
    
        //这个时间戳值的月
        int monthTmp = 0;
        for (monthTmp = 1; monthTmp < MONTH_PER_YEAR; monthTmp++) {
           dayTmp = applib_dt_last_day_of_mon(monthTmp, year);
           if (days >= dayTmp) {
               days -= dayTmp;
           }
           else
           {
               break;
           }
        }
        month = monthTmp;
    
        day = days + 1;
    
        //转化成秒。
        int secs = ts % SEC_PER_DAY;
        //这个时间戳值的小时数。
        hour = secs / SEC_PER_HOUR;
        //这个时间戳值的分钟数。
        secs %= SEC_PER_HOUR;
        minute = secs / SEC_PER_MIN;
        //这个时间戳的秒钟数。
        second = secs % SEC_PER_MIN;
    
        printf("%d-%d-%d %d:%d:%d
    
    ", year, month, day, hour, minute, second);
    }
    
    
    void main()
    {
        change(1558443421);
    }
    
    /*************************************************************************************
    **************************************************************************************
    ************************ unix timestamp to time string [ end ] ***********************
    **************************************************************************************
    ***************************************************************************************/

    参考博客: https://blog.csdn.net/mill_li/article/details/54599927

  • 相关阅读:
    java事件处理(贪吃蛇)
    九九乘法表
    使用文件包含指令include
    jsp页面的基本构成
    软件测试博客

    成功职业女性处世的10大秘诀
    再见啦,冬冬妹
    网摘——杜晓眼眼中的尹珊珊:什么都要,什么都要得到
    网摘——事关“工程师思维”
  • 原文地址:https://www.cnblogs.com/chorm590/p/10901265.html
Copyright © 2020-2023  润新知