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