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
转载于:https://www.cnblogs.com/chorm590/p/10901265.html
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
