Просмотр полной версии : [Вопрос] Есть ли в 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)?
На основе последнего варианта я сделал свой
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
Благодарю за помощь
Високосные года учитываются?
Desulaid
27.01.2016, 17:46
Високосные года учитываются?
Вариант OKStyle не учитывает, все остальные - учитывают, если верить форуму.
Вариант OKStyle не учитывает, все остальные - учитывают, если верить форуму.
А можно узнать, как учитывать високосные года?
$continue$
27.01.2016, 18:30
А можно узнать, как учитывать високосные года?
Не учитывается.
http://i.imgur.com/0uXrM0d.png
Не учитывается.
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
Так какой вариант лучше использовать? Просто для меня еще сложно разбираться в таком коде, не могу определить.
Соглашусь, пожалуй. Я тут подумал и, кажется, первый вариант учитывает високосный год.
- - - Добавлено - - -
Есть еще вариант
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)]);
}
Из официальной документации к 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;
}
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot