PDA

Просмотр полной версии : [Вопрос] Есть ли в Pawn функция, возвращающая день недели



TheOrsini
27.01.2016, 08:42
Как в pawn можно узнать день недели (или его порядковый номер)?

Desulaid
27.01.2016, 10:23
Стоит сначала немного погуглить ...


Вариант великого короля Pawno скриптинга всея легенда рашн комьюнити


stock getDay()
{
new g_Date[3], g_Week[10], g_Result;
getdate(g_Date[0], g_Date[1], g_Date[2]);
g_Result = g_Date[2] + (g_Date[1] * 2) + ((3 * g_Date[1] * 1) / 5) + g_Date[0] + (g_Date[0] / 4) - (g_Date[0] / 100) + (g_Date[0] / 400) + 2;
switch(g_Result / 7)
{
case 0:
{
g_Week = "Saturday";
}
case 1:
{
g_Week = "Sunday";
}
case 2:
{
g_Week = "Monday";
}
case 3:
{
g_Week = "Tuesday";
}
case 4:
{
g_Week = "Wednesday";
}
case 5:
{
g_Week = "Thursday";
}
case 6:
{
g_Week = "Friday";
}
}
return g_Week;
}

Вариант OFFREAL


stock DayOfWeakName(UTC)
{
new dayname[32];
switch(((gettime()+UTC*3600)/86400)%7)
{
case 0: strcat(dayname, "Четверг");
case 1: strcat(dayname, "Пятница");
case 2: strcat(dayname, "Суббота");
case 3: strcat(dayname, "Воскресенье");
case 4: strcat(dayname, "Понедельник");
case 5: strcat(dayname, "Вторник");
case 6: strcat(dayname, "Среда");
}
return dayname;
}

На основе последнего варианта я сделал свой


stock GetWeakName(UTC, name[12])
{
static const
days_weak[][] =
{
!"Четверг",
!"Пятница",
!"Суббота",
!"Воскресенье",
!"Понедельник",
!"Вторник",
!"Среда"
};
strcat(name, days_weak[(((gettime()+UTC*3600)/86400)%7)]);
}

Что такое UTC (http://www.kakras.ru/doc/time-zone.html)?

ziggi
27.01.2016, 11:24
На основе последнего варианта я сделал свой


stock GetWeakName(UTC, name[12])
{
static const
days_weak[][] =
{
!"Четверг",
!"Пятница",
!"Суббота",
!"Воскресенье",
!"Понедельник",
!"Вторник",
!"Среда"
};
strcat(name, days_weak[(((gettime()+UTC*3600)/86400)%7)]);
}

Что такое UTC (http://www.kakras.ru/doc/time-zone.html)?

Пара косяков есть, поправил:


stock GetWeekName(UTC, name[], size = sizeof(name))
{
static const
days_week[][] =
{
!"Четверг",
!"Пятница",
!"Суббота",
!"Воскресенье",
!"Понедельник",
!"Вторник",
!"Среда"
};

return
strunpack(name, days_week[(((gettime()+UTC*3600)/86400)%7)], size);
}

Но заполнение массива days_week лучше тоже вынести в параметры, чтобы можно было сохранить мультиязычность функции.

То есть как-то так:


enum WeekLang {
WEEK_LANG_ENGLISH,
WEEK_LANG_RUSSIAN,
}

static const
gDaysOfWeek[WeekLang][][] = {
{
!"Thursday",
!"Friday",
!"Saturday",
!"Sunday",
!"Monday",
!"Tuesday",
!"Wednesday"
},
{
!"Четверг",
!"Пятница",
!"Суббота",
!"Воскресенье",
!"Понедельник",
!"Вторник",
!"Среда"
}
};

stock GetWeekName(UTC, name[], const size = sizeof(name), const WeekLang:lang = WEEK_LANG_ENGLISH)
{
return
strunpack(name, gDaysOfWeek[lang][((gettime() + UTC * 3600) / 86400) % 7], size);
}

TheOrsini
27.01.2016, 16:38
Благодарю за помощь

L0ndl3m
27.01.2016, 16:55
Високосные года учитываются?

Desulaid
27.01.2016, 17:46
Високосные года учитываются?

Вариант OKStyle не учитывает, все остальные - учитывают, если верить форуму.

L0ndl3m
27.01.2016, 17:54
Вариант OKStyle не учитывает, все остальные - учитывают, если верить форуму.
А можно узнать, как учитывать високосные года?

$continue$
27.01.2016, 18:30
А можно узнать, как учитывать високосные года?

Не учитывается.

http://i.imgur.com/0uXrM0d.png

L0ndl3m
27.01.2016, 19:48
Не учитывается.

http://i.imgur.com/0uXrM0d.png

А я думал мне Untonyst ответит...
Untonyst, есть что добавить?

Desulaid
27.01.2016, 20:16
А я думал мне Untonyst ответит...
Untonyst, есть что добавить?

Соглашусь, пожалуй. Я тут подумал и, кажется, первый вариант учитывает високосный год.

- - - Добавлено - - -

Есть еще вариант


stock GetDay(year, month, day, name[], const size = sizeof(name))
{
static const
days_week[][] =
{
!"Понедельник",
!"Вторник",
!"Среда",
!"Четверг",
!"Пятница",
!"Суббота",
!"Воскресенье"
};

new
a = (12 - month) / 12,
y = year - a,
m = month + 12 * a - 2,
d = (7000 + day + y + (y/4) - (y/100) + (y/400) + ((31*m)/12))%7;

return strunpack(name, days_week[d], size);
}

main()
{
new
name[12],
year, month, day;

getdate(year, month, day);
GetDay(year, month, day, name);
print(name);
}

Слизал с варианта на PHP :D

TheOrsini
27.01.2016, 21:40
Так какой вариант лучше использовать? Просто для меня еще сложно разбираться в таком коде, не могу определить.

_lizard
18.08.2016, 12:42
Соглашусь, пожалуй. Я тут подумал и, кажется, первый вариант учитывает високосный год.

- - - Добавлено - - -

Есть еще вариант


stock GetDay(year, month, day, name[], const size = sizeof(name))
{
static const
days_week[][] =
{
!"Понедельник",
!"Вторник",
!"Среда",
!"Четверг",
!"Пятница",
!"Суббота",
!"Воскресенье"
};

new
a = (12 - month) / 12,
y = year - a,
m = month + 12 * a - 2,
d = (7000 + day + y + (y/4) - (y/100) + (y/400) + ((31*m)/12))%7;

return strunpack(name, days_week[d], size);
}

main()
{
new
name[12],
year, month, day;

getdate(year, month, day);
GetDay(year, month, day, name);
print(name);
}

Слизал с варианта на PHP :D

Вариант, кстати, нерабочий. Возвращает дни с погрешностью в 1-3 дня.
Сделал что-то типо костыля, критика приветствуется, пока проблем не обнаружил.

stock GetNumberDay(year, month, day)
{
new
a = (12 - month)/12,
y = year - a,
m = month + 12 * a - 2,
d = (7000 + day + y + (y/4) - (y/100) + (y/400) + ((31*m)/12)) % 7;
if(!(year % 4) && (year/400) != 0 && (month == 1 || month == 2)) // Если год високосный и месяц - январь/февраль, то к дню нужно прибавить ещё 1 день
return (d == 6 ? 0 : d+1);
else
{
if(month == 1 || month == 2) // Если год невисокосный и месяц - январь/февраль, нужно прибавить 2 дня
return (d==5 ? 0 : d+2);
}
return d;
}



static const DayNames[][] = {
"Воскресенье", // Именно воскресенье должно быть первым (нулевым) в массиве
"Понедельник",
"Вторник",
"Среда",
"Четверг",
"Пятница",
"Суббота"
};
main()
{
new year, month, day;
getdate(year, month, day);
printf("Сегодня %s", DayNames[GetNumberDay(year, month, day)]);
}

ziggi
19.08.2016, 01:49
Из официальной документации к Pawn:

weekday(day, month, year)
{
if (month <= 2)
month += 12, --year;
new j = year % 100;
new e = year / 100;
return (day + (month+1)*26/10 + j + j/4 + e/4 - 2*e) % 7;
}