Skip to content

Instantly share code, notes, and snippets.

@xTCry
Last active March 8, 2021 17:26
Show Gist options
  • Save xTCry/1262e884a9e3f7585308f6f8d4a35b1a to your computer and use it in GitHub Desktop.
Save xTCry/1262e884a9e3f7585308f6f8d4a35b1a to your computer and use it in GitHub Desktop.
VK Widget date, weeks

VK Widget Недельности

Пример того, как получить год, день и т.д. из Unix time

Т.к. в Widgets group в ВК нету возможности в JS работать с Data, пришлось вот так извратиться

Недельность в группу

include "main.js";

В примере вывода таблицы, бывает, глючит на некоторых датах: смещение на один день назад или вперед в онце недели. И ч.т.п.

// Table Ver 3.7.1 08.03.2021
var numWeek;
var iconEven = "id"+Args.uid,
iconOdd = "club170840389";
var xTZ = 60 *60 *3;
var xDAY = 60 *60 *24; // 86400
var xWEEK = xDAY *7; // 604800
var seconds, minutes, hours, days, weeks, months, years,
fSeconds, fMinutes, fHours, fDays, fWeeks, fMonths, fYears;
// Смещение недель для быстрой проверки
var testWEEK = 0,
testDAY = 0;
var testWeekAdd = xWEEK * testWEEK + xDAY * testDAY;
var cTime = API.utils.getServerTime({}) + xTZ + testWeekAdd; // timestap + TZ
// Дата начала отсчета недельности
var oTime = 1535760000; // 01.09.2018 00:00 - Первый семестр
oTime = 1549238400; // 04.02.2019 00:00 - Второй семестр
oTime = 1567285200; // 01.09.2019 00:00 - Третий семестр
oTime = 1598907600; // 01.09.2020 00:00 - Пятый семестр
oTime = 1612742400; // 01.09.2020 00:00 - Шестой семестр (NOW)
// Получили номер недели указанной даты
var targWeek = (oTime / xWEEK) |0;
// ===================================
// Вычисление текущей даты
var fulldays = (cTime/xDAY)|0;
var ty = (fulldays / 365.25) | 0;
var fdac;
if (ty >= 0)
fdac = ty * 365 + (((ty + 1)/ 4)|0) - (((ty + 69)/ 100)|0) + (((ty + 369)/ 400)|0);
else
fdac = ty * 365 + (((ty - 2)/ 4)|0) - (((ty - 30)/ 100)|0) + (((ty - 30)/ 400)|0);
fdac = fulldays - fdac;
fYears = 1970 + ty;
var trest = cTime % xDAY;
var MonthsName = ["Января", "Февраля", "Марта", "Апреля", "Мая", "Июня", "Июля", "Августа", "Сентября", "Октября", "Ноября", "Декабря"];
var subTable;
if((fYears % 400) == 0 || ((fYears % 100) != 0) && (fYears % 4) == 0) // 366 days in year
subTable = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
else
subTable = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
fMonths = 0;
var i = 0;
while (fdac + 1 > subTable[i]) {
fdac = fdac - subTable[i];
fMonths = fMonths +1;
i = i + 1;
}
fdac = fdac+1;
fMonths = fMonths +1;
years = fYears + ((fMonths==12)? 0: ((fMonths / 12) | 0));
months = (fMonths==12)? 12: (fMonths % 12);
days = fdac;
hours = (trest / 3600) | 0;
trest = trest % 3600;
minutes = (trest / 60) | 0;
trest = trest % 60;
seconds = trest;
// ===================================
var currentData = //" ["+hours+":"+minutes+":"+seconds+"] "+
" ["+(days>9?days:"0"+days)+"."+(months>9?months:"0"+months)+"."+years
//+" "+(hours>9?hours:"0"+hours)+":"+(minutes>9?minutes:"0"+minutes)
+"]";
var cFixTime = xDAY*3; // FIX для расчета недель
var cWeek = ((cTime+cFixTime)/xWEEK)|0;
numWeek = cWeek - targWeek;
var widgetTitle = "Недельность " + currentData;
var titleWeek = numWeek;
if(numWeek < 1) {
titleWeek = numWeek * -1;
widgetTitle = widgetTitle + "; Осталось недель ";
}
// Формирование информации для вывода
var tD1 = "1 — 7 октября",
tD2 = "8 — 14 октября",
tD3 = "15 — 21 октября",
tD4 = "22 — 28 Октября";
var startDay = 0,
newWeek = 0,
firstWeek = false,
nd = xDAY;
var _fdac, _fYears, _fMonths, _years;
while (!firstWeek) {
nd = nd + xDAY;
startDay = startDay + 1;
newWeek = ((cTime+cFixTime+nd)/xWEEK) |0;
if(newWeek != cWeek) {
if(startDay == 1 && days%7 == 3) {
startDay = 0;
}
firstWeek = true;
}
// FTW Fix 2019
if(
(months == 4 && days%7 == 0)
|| (months == 5 && days%7 == 5)
|| (months == 6 && days%7 == 2)
|| (months == 7 && days%7 == 0)
|| (months == 10 && days%7 == 4)
// ...
)
startDay = startDay - 1;
}
var lastWeekDay = days + startDay;
var d_11, d_12, m_1, mi_1,
d_21, d_22, m_2, mi_2,
d_31, d_32, m_3, mi_3,
d_41, d_42, m_4, mi_4;
var monthsFix120 = months,
monthsFix = months-1,
monthsFix0 = months+1,
monthsFix2 = months-2;
monthsFix = (monthsFix >= 12)? (12 - monthsFix): ((monthsFix < 0)? (12 + monthsFix): monthsFix);
monthsFix120 = (monthsFix120 >= 12)? (12 - monthsFix120): ((monthsFix120 < 0)? (12 + monthsFix120): monthsFix120);
monthsFix0 = (monthsFix0 >= 12)? (12 - monthsFix0): ((monthsFix0 < 0)? (12 + monthsFix0): monthsFix0);
monthsFix2 = (monthsFix2 >= 12)? (12 - monthsFix2): ((monthsFix2 < 0)? (12 + monthsFix2): monthsFix2);
d_12 = (lastWeekDay-7);
d_11 = (d_12-6);
d_22 = lastWeekDay;
d_21 = (lastWeekDay-6);
d_32 = (lastWeekDay+7);
d_31 = (d_32-6);
d_42 = (lastWeekDay+7*2);
d_41 = (d_42-6);
// 1 week (прошлая неделя)
if(d_11 > 0) {
mi_1 = monthsFix; // Текущий месяц
}
else {
mi_1 = monthsFix2; // Предыдущий месяц
d_11 = d_11 * -1;
if(d_12>0 && d_12 < subTable[mi_1]) {
if(d_11 < d_12 && months != 1 )
d_12 = subTable[mi_1] - d_12;
else
mi_1 = monthsFix;
}
else if(d_12 <= 0) {
d_12 = d_12 * -1;
if(d_12 < subTable[mi_1]) {
if(d_11 < d_12 || months==12)
d_12 = subTable[mi_1] - d_12;
else {
d_12 = subTable[mi_1] - d_12;
if(mi_1 != 1)
mi_1 = monthsFix2;
}
}
else
d_12 = subTable[monthsFix] - d_12;
}
if(d_11 < subTable[monthsFix2])
d_11 = subTable[monthsFix2] - d_11;
}
m_1 = MonthsName[mi_1];
// 2 week (текущая неделя)
mi_2 = monthsFix; // Текущий месяц
m_2 = MonthsName[mi_2];
if(d_21 > subTable[mi_2])
d_21 = d_21 - subTable[mi_2];
else if(d_21 <= 0 )
d_21 = subTable[monthsFix2] + d_21;
if(d_22 <= subTable[monthsFix] || (months==12 && d_22 <= subTable[monthsFix])) {
mi_2 = monthsFix;
}
else {
mi_2 = monthsFix120;
d_22 = d_22 - subTable[monthsFix];
}
//if(d_21 > d_22 )
// m_2 = MonthsName[mi_2];
// Последующие недели
// 3 week
if(d_32 <= subTable[monthsFix] || (months==12 && d_32 <= subTable[monthsFix])) {
// Если последний день недели текущего месяца,
// то ставим текущий месяц
mi_3 = monthsFix;
}
else {
d_32 = d_32 - subTable[monthsFix];
mi_3 = monthsFix120;
}
if(d_31 > subTable[monthsFix])
d_31 = d_31 - subTable[monthsFix];
if(d_32 > subTable[monthsFix])
d_32 = d_32 - subTable[monthsFix];
m_3 = MonthsName[mi_3];
// 4 week
if(d_42 <= subTable[monthsFix] || (months==12 && d_42 <= subTable[monthsFix])) {
mi_4 = monthsFix;
}
else {
d_42 = d_42 - subTable[monthsFix];
mi_4 = monthsFix120;
}
if(d_41 > subTable[monthsFix])
d_41 = d_41 - subTable[monthsFix];
if(d_42 > subTable[monthsFix])
d_42 = d_42 - subTable[monthsFix];
m_4 = MonthsName[mi_4];
tD1 = d_11+" — " + d_12 +" "+m_1;
tD2 = d_21+" — " + d_22 +" "+m_2;
tD3 = d_31+" — " + d_32 +" "+m_3;
tD4 = d_41+" — " + d_42 +" "+m_4;
return {
"title": widgetTitle,
"title_counter": titleWeek,
"head": [
{
"text": "Неделя",
"align": "left"
},
{
"text": "Тип"
},
{
"text": "Дата",
"align": "center"
}
],
"body": [
[
{
"text": "#"+(numWeek-1),
"icon_id": ((numWeek-1)%2!=0?iconOdd:iconEven)
},
{
"text": ((numWeek-1)%2!=0?"НЕ":"")+"ЧЕТНАЯ"
},
{
"text": tD1
}
],
[
{
"text": "#"+numWeek+" СЕЙЧАС",
"icon_id": (numWeek%2!=0?iconOdd:iconEven)
},
{
"text": (numWeek%2!=0?"НЕ":"")+"ЧЕТНАЯ"
},
{
"text": tD2
}
],
[
{
"text": "#"+(numWeek+1),
"icon_id": ((numWeek+1)%2!=0?iconOdd:iconEven)
},
{
"text": ((numWeek+1)%2!=0?"НЕ":"")+"ЧЕТНАЯ"
},
{
"text": tD3
}
],
[
{
"text": "#"+(numWeek+2),
"icon_id": ((numWeek+2)%2!=0?iconOdd:iconEven)
},
{
"text": ((numWeek+2)%2!=0?"НЕ":"")+"ЧЕТНАЯ"
},
{
"text": tD4
}
]
]
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment