2016-03-19 65 views
4

我正在做一個功能,UNIX時間轉換爲日期(DD-MM-YYYY)轉換Unix時間去約會

stock UnixToTime(x) 
{ 
    new year = 1970; 
    new dia = 1; 
    new mes = 1; 

    while(x > 86400) 
    { 
     x -= 86400; 
     dia ++; 

     if(dia == getTotalDaysInMonth(mes, year)) 
     { 
      dia = 1; 
      mes ++; 

      if (mes >= 12) 
      { 
       year ++; 
       mes = 1; 
      } 
     } 
    } 
    printf("%i-%i-%i", dia, mes, year); 
    return x; 
} 

,但不起作用。

我正在測試功能1458342000(今天...)但打印> 13-3-2022,有什麼錯誤?

#define IsLeapYear(%1)  ((%1 % 4 == 0 && %1 % 100 != 0) || %1 % 400 == 0) 

getTotalDaysInMonth is this;

stock getTotalDaysInMonth(_month, year) 
{ 
    new dias[] = { 
     31, // Enero 
     28, // Febrero 
     31, // Marzo 
     30, // Abril 
     31, // Mayo 
     30, // Junio 
     31, // Julio 
     31, // Agosto 
     30, // Septiembre 
     31, // Octubre 
     30, // Noviembre 
     31 // Diciembre 
    }; 
    return ((_month >= 1 && _month <= 12) ? (dias[_month-1] + (IsLeapYear(year) && _month == 2 ? 1 : 0)) : 0); 
} 
+0

還張貼'IsLeapYear'的代碼。 – chqrlie

+0

如果你需要類似的東西來製作,我會看看這個只包含頭文件的庫:https://github.com/HowardHinnant/date – MikeMB

+0

這裏有一些庫函數。你爲什麼不使用它們呢? –

回答

3

有幾個問題你的算法:

  • while循環測試應該是while(x >= 86400),否則你是關閉的某天午夜。
  • 只有當mes > 12而不是>=時,您才應該跳到新的一年。
  • 計數天數相同的問題:您應該勾選月份,如果if (dia > getTotalDaysInMonth(mes, year))否則您跳過每個月的最後一天。
  • getTotalDaysInMonth(mes, year)的代碼似乎沒問題。
  • IsLeapYear的代碼可能比普通的格里高利規則更簡單,因爲1970年到2099年間沒有例外。您仍然應該發佈該代碼以防萬一出現錯誤。

這裏是一個修正版本:

stock UnixToTime(x) { 
    new year = 1970; 
    new dia = 1; 
    new mes = 1; 

    while (x >= 86400) { 
     x -= 86400; 
     dia++; 
     if (dia > getTotalDaysInMonth(mes, year)) { 
      dia = 1; 
      mes++; 
      if (mes > 12) { 
       year++; 
       mes = 1; 
      } 
     } 
    } 
    printf("%i-%i-%i\n", dia, mes, year); 
    return x; 
} 
+0

相似,謝謝,你是對的。 和寬恕,我添加它。 IsLeapYear函數是基本常用的。((%1%4 == 0 &&%1%100!= 0)||%1%400 == 0) – iZume

+0

我已經做了更改,現在打印:10.12。 2017年。 – iZume

+0

@Spitzer:同樣的問題的日子... – chqrlie