Unix时间戳与C# DateTime时间类型、C语言互换 1970-01-01 00:00:00
和同事的下位机交互的时候,需要使用到时间转换,
刚好找到这篇文章,用C语言实现的话,还挺麻烦的
下面给出C#和C的源码
注:C# 转自 http://www.cnblogs.com/hanhualangzi/archive/2012/02/10/2345952.html
C源码是同事给我的;
C#:
1 dangranusing System; 2 using System.Collections.Generic; 3 using System.Text; 4 5 namespace WWFramework.DateTimes 6 { 7 /// <summary> 8 /// 时间相关函数 9 /// </summary> 10 public static class Function 11 { 12 /// <summary> 13 /// 将Unix时间戳转换为DateTime类型时间 14 /// </summary> 15 /// <param name="d">double 型数字</param> 16 /// <returns>DateTime</returns> 17 public static System.DateTime ConvertIntDateTime(double d) 18 { 19 System.DateTime time = System.DateTime.MinValue; 20 System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); 21 time = startTime.AddSeconds(d); 22 return time; 23 } 24 25 /// <summary> 26 /// 将c# DateTime时间格式转换为Unix时间戳格式 27 /// </summary> 28 /// <param name="time">时间</param> 29 /// <returns>double</returns> 30 public static double ConvertDateTimeInt(System.DateTime time) 31 { 32 double intResult = 0; 33 System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); 34 intResult = (time - startTime).TotalSeconds; 35 return intResult; 36 } 37 } 38 }
C源码:
1 struct tm 2 { 3 uint32 tm_sec; /* seconds after the minute - [0, 59] */ 4 uint32 tm_min; /* minutes after the hour - [0, 59] */ 5 uint32 tm_hour; /* hours since midnight - [0, 23] */ 6 uint32 tm_mday; /* day of the month - [1, 31] */ 7 uint32 tm_mon; /* months since January - [0, 11] */ 8 uint32 tm_year; /* year since 1900 */ 9 uint32 tm_wday; /* days since Sunday - [0, 6] */ 10 uint32 tm_yday; /* days since January 1 - [0, 365] */ 11 uint32 tm_isdst; /* Daylight Saving Time flag */ 12 }; 13 tm time; 14 void localtime_h(uint32 time, struct tm *ret_time) 15 { 16 static const char month_days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; 17 static const char leap_year[4] = {0, 0, 1, 0}; 18 uint32 j = 0; 19 uint32 day_count = 0; 20 uint32 i = 0; 21 uint32 leave_for_fouryear = 0; 22 uint32 four_year_count = 0; 23 uint32 temp_value = 0; 24 uint32 leave_for_year_days; 25 uint32 leave_for_month_days; 26 //time=time-28800; 27 ret_time->tm_sec = 0; 28 ret_time->tm_min = 0; 29 ret_time->tm_hour = 0; 30 ret_time->tm_wday = 0; 31 ret_time->tm_year = 0; 32 ret_time->tm_mday = 0; 33 ret_time->tm_mon = 0; 34 ret_time->tm_sec = time % 60; 35 temp_value = time / 60; 36 ret_time->tm_min = temp_value % 60; 37 temp_value /= 60; 38 temp_value += 8; 39 ret_time->tm_hour = temp_value % 24; 40 temp_value /= 24; 41 ret_time->tm_wday = (temp_value + 4) % 7; 42 four_year_count = temp_value / (365 * 4 + 1); 43 leave_for_fouryear = temp_value % (365 * 4 + 1); 44 leave_for_year_days = leave_for_fouryear; 45 for (i = 0; i < 4; i++) 46 { 47 day_count = leap_year[i] ? 366 : 365; 48 49 if (leave_for_year_days <= day_count) 50 { 51 break; 52 } 53 else 54 { 55 leave_for_year_days -= day_count; 56 } 57 } 58 ret_time->tm_year = four_year_count * 4 + i ; 59 ret_time->tm_yday = leave_for_year_days; 60 leave_for_month_days = leave_for_year_days; 61 for (j = 0; j < 12; j++) 62 { 63 if (((leap_year[i])) && (j == 1)) 64 { 65 if (leave_for_month_days <= 29) 66 { 67 break; 68 } 69 else if (leave_for_month_days == 29) 70 { 71 i++; 72 leave_for_month_days = 0; 73 break; 74 } 75 else 76 { 77 leave_for_month_days -= 29; 78 } 79 80 continue; 81 } 82 83 if (leave_for_month_days < month_days[j]) 84 { 85 break; 86 } 87 else if(leave_for_month_days == month_days[j]){ 88 i++; 89 leave_for_month_days = 0; 90 break; 91 } 92 else 93 { 94 leave_for_month_days -= month_days[j]; 95 } 96 } 97 ret_time->tm_mday = leave_for_month_days + 1; 98 ret_time->tm_mon = j; 99 } 100 void ConvSecTimeToCalendar(struct tm *t_tm,uint32 t) 101 { 102 t=(t>=28800)?(t-28800):t; 103 localtime_h(t,t_tm); 104 t_tm->tm_year +=1970; 105 t_tm->tm_mon +=1; 106 }