将 unix 时间转换为日期
convert unix time to date
我正在做一个函数,将 unix 时间转换为日期 (dd-mm-yyyy)
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);
}
你的算法有几个问题:
- while 循环测试应该是
while(x >= 86400)
,否则你将在一天的午夜前离开。
- 你应该只在
mes > 12
时跳到新的一年,而不是 >=
。
- 同样的计算天数的问题:如果
if (dia > getTotalDaysInMonth(mes, year))
你应该勾选月份,否则你会跳过每个月的最后一天。
getTotalDaysInMonth(mes, year)
的代码似乎没问题。
IsLeapYear
的代码可以比通用公历规则更简单,因为 1970 年到 2099 年之间没有例外。您仍然应该 post 它以防出现错误。
这是更正后的版本:
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;
}
我正在做一个函数,将 unix 时间转换为日期 (dd-mm-yyyy)
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);
}
你的算法有几个问题:
- while 循环测试应该是
while(x >= 86400)
,否则你将在一天的午夜前离开。 - 你应该只在
mes > 12
时跳到新的一年,而不是>=
。 - 同样的计算天数的问题:如果
if (dia > getTotalDaysInMonth(mes, year))
你应该勾选月份,否则你会跳过每个月的最后一天。 getTotalDaysInMonth(mes, year)
的代码似乎没问题。IsLeapYear
的代码可以比通用公历规则更简单,因为 1970 年到 2099 年之间没有例外。您仍然应该 post 它以防出现错误。
这是更正后的版本:
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;
}