C 将unix时间转换为日期

C 将unix时间转换为日期,c,algorithm,pawn,C,Algorithm,Pawn,我正在做一个函数,将unix时间转换为日期(dd-mm-yyyy) 但不是工作 我正在用1458342000(今天…)测试函数,但是print>13-3-2022,有什么错误 #define IsLeapYear(%1) ((%1 % 4 == 0 && %1 % 100 != 0) || %1 % 400 == 0) 这个月的总日数是多少 stock getTotalDaysInMonth(_month, year) { new dias[] = {

我正在做一个函数,将unix时间转换为日期(dd-mm-yyyy)

但不是工作

我正在用1458342000(今天…)测试函数,但是print>13-3-2022,有什么错误

#define IsLeapYear(%1)      ((%1 % 4 == 0 && %1 % 100 != 0) || %1 % 400 == 0)
这个月的总日数是多少

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);
}
stockgettotaldaysinmonth(\u月,年)
{
新dias[]={
31,//Enero
28,//费布雷罗
31,//马尔佐
30,//Abril
31,//梅奥
30,//Junio
31,//胡里奥
31,//Agosto
30,//Septiembre
31,//Octubre
30,//Noviembre
31//Diciembre
};

return((\u month>=1&&u month您的算法有几个问题:

  • 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;
}

还发布了
IsLeapYear
的代码。如果您在生产中需要类似的东西,我会看看这个仅标题的库:有用于这类东西的库函数。为什么不改用它们呢?这种语言编程不是cpp,是PAWN,是C的派生,只是在这种语言编程中非常有限,仅限于基本说明和数学。
UnixToTime(x)
和可能的
\define IsLeapYear(%1)
都无效
C
C++
。建议删除它们并使用正确的语言进行标记。谢谢,你是对的。原谅,我添加了它。IsLeapYear函数是常用的基本函数((%1%4==0&%1%100!=0) || %1 % 400 == 0)这很有效!谢谢!我有一个问题,在我的国家是19-03-16,对吗?或者我将在日计数器中添加+1?时间函数返回UTC时间的秒数。如果你在伦敦以东超过1小时,那里已经是星期天了,但截至本帖,19-03-2016在UTC中是正确的。要获取当地时间和日期,请添加数字of调用函数前时间差的秒数。
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;
}