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\n\n", 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM