Конвертировать unix время в дату

Я делаю функцию, чтобы конвертировать время 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 - это;

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

1 ответ

Решение

Есть несколько проблем с вашим алгоритмом:

  • тест цикла 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;
}
Другие вопросы по тегам