Author Topic: День недели  (Read 4080 times)

0 Members and 1 Guest are viewing this topic.

ValeraVVV

  • Зашел в гости
  • *
  • Posts: 13
    • View Profile
День недели
« on: May 26, 2016, 10:01:31 PM »
Очень нужно как-то определять в скрипте день недели. Но как его вычислить скриптом или взять данные из другого приложения не  знаю..
Подскажите пожалуйста. Оченя нуна.

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: День недели
« Reply #1 on: May 27, 2016, 12:58:26 AM »
можно позаимствовать дату с какого-нибудь сервера с помощью HTTPGET. попробовал с первым что мне дал поисковик.

Code: (clickermann) [Select]
$get = HTTPGET ("http://time100.ru")
$str = STRPOS ($get, "сегодня:")
print(STRFILTER (STRCUT ($get, $str+12, 50), "</budiv>"))
halt
в логе
Code: [Select]
0:55:07 27 мая 2016 года, пятница

ValeraVVV

  • Зашел в гости
  • *
  • Posts: 13
    • View Profile
Re: День недели
« Reply #2 on: May 27, 2016, 01:25:11 AM »
можно позаимствовать дату с какого-нибудь сервера с помощью HTTPGET. попробовал с первым что мне дал поисковик.

Code: (clickermann) [Select]
$get = HTTPGET ("http://time100.ru")
$str = STRPOS ($get, "сегодня:")
print(STRFILTER (STRCUT ($get, $str+12, 50), "</budiv>"))
halt
в логе
Code: [Select]
0:55:07 27 мая 2016 года, пятница

классное решение. но не в моем случаи (когда доступа к инету не будет).

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: День недели
« Reply #3 on: May 27, 2016, 02:15:27 AM »
вот тебе еще вариант, берем календарь в текстовом формате. я взял отсюда http://macmax.ru/calendar/ . создаем формат календаря на свой вкус. мне показалось, что будет проще, если каждая строка = день в году.
Code: [Select]
Январь 1 Пятница
Январь 2 Суббота
Январь 3 Воскресенье
Январь 4 Понедельник
Январь 5 Вторник
Январь 6 Среда
Январь 7 Четверг
Январь 8 Пятница
Январь 9 Суббота
....
...
ну а дальше, зная месяц и число, с легкостью определяем номер строки, а тем самым и день недели.


Code: (clickermann) [Select]
SWITCH($_date_m)
CASE(1)
   $month = "Январь"
CASE(2)
   $month = "Февраль"
CASE(3)
   $month = "Март"
CASE(4)
   $month = "Апрель"
CASE(5)
   $month = "Май"
CASE(6)
   $month = "Июнь"
CASE(7)
   $month = "Июль"
CASE(8)
   $month = "Август"
CASE(9)
   $month = "Сентябрь"
CASE(10)
   $month = "Октябрь"
CASE(11)
   $month = "Ноябрь"
CASE(12)
   $month = "Декабрь"
DEFAULT
END_SWITCH

FOR($a=0,$a<365)
   IF(STRPOS (TFREAD ("календарь.txt",$a), $month)>0)
      IF(STRPOS (TFREAD ("календарь.txt",$a), $_date_d)>0)
         print(TFREAD ("календарь.txt",$a))
         $a=365
      END_IF
   END_IF
END_CYC

halt

во вложении календарь на 2016г

ValeraVVV

  • Зашел в гости
  • *
  • Posts: 13
    • View Profile
Re: День недели
« Reply #4 on: May 27, 2016, 10:44:22 AM »
как здорово что столько предложений.  и все живые идея.
однако я попробовал поступить по-другому.
попробовал высчитать.
и о,эврика! оно поддается расчетам .
погуглив нашел несколько формул выбрал одну и в итоге родилось "нечто" :)
Code: (clickermann) [Select]
// Для нашего современного календаря:
///W = d + [ (13m - 1) / 5 ] + y + [ y / 4 ] + [ c / 4 ] - 2c

/// где d - число месяца;
/// m - номер месяца, начиная с марта (март=1, апрель=2, ..февраль=12);
/// y - номер года в столетии (например, для 1965 года y=65. Для января и февраля 1965 года, т. е. для m=11 или m=12 номер года надо брать предыдущий, т. е. y=64);
//// c - количество столетий (например, для 2000 года c=20. И здесь для января и февраля 2000 года надо брать предыдущее столетие с=19);
///квадратные скобки означают целую часть полученного числа (отбрасываем дробную) .

/// Результат W делите на 7 и модуль остатка от деления даст день недели (воскресенье=0, понедельник=1, ..суббота=6)

//// Пример: для 31 декабря 2008 года определяем:
/// d=31, m=10, y=8, c=20

/// По формуле находим:
//// W = 31 + [ ( 13 * 10 - 1 ) / 5 ] + 8 + [ 8 / 4 ] + [ 20 / 4 ] - 2 * 20 =
/// = 31 + 25 + 8 + 2 + 5 - 40 = 31

/// Теперь делим W на 7 и находим остаток от деления: 31 / 7 = 4 и 3 в остатке.
/// Тройка соответствует дню недели СРЕДА.



//// вставляем формулу для годов 2001-2099 (мне хватит) :
logclear
$d=$_date_d
$m=$_date_m
$y=strcut($_date_y,3,2)
$c=strcut($_date_y,1,2)
/// опред. месяц для формулы
$m=$m-2
   if ($m=-1)
      $m=11
      $y=$y-1
   end_if
   if ($m=0)
      $m=12
      $y=$y-1
   end_if
 //// дальше просто по формуле кусками
$x1=int((13*$m-1)/5)
$x2=int($y/4)
$x3=$d+$x1+$y+$x2+int($c/4)-($c*2)
$x4=int($x3/7)
$x5=$x3-($x4*7)
   if ($x5<0)
        $x5=$x5+7
   end_if

print ("Порядковый день недели:",$x5)

halt


то что и требовалось!
проверил- работает
сори за примитивный и кривой скрипт, но мне было не до  красот
можно конечно и оформить , возможно кому и пригодиться (например, запуск куска скрипта по рабочим дням или т.п.)


Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: День недели
« Reply #5 on: May 27, 2016, 11:31:54 AM »
Молодца. Чего мучаться, если можно посчитать.

оптимизэйшен
Code: (clickermann) [Select]
// опред. месяц для формулы
$m = $m - 2
IF($m < 1)
   $m = $m + 12
   $y = $y - 1
END_IF

$nd = $d + INT((13*$m - 1) / 5) + $y + INT($y/4) + int($c/4) - (2*$c)
$day_week = $nd - (INT($nd/7) * 7)

И не пойму, нафига это?
Code: (clickermann) [Select]
IF($day_week < 0)
   $day_week = $day_week + 7
END_IF
« Last Edit: May 27, 2016, 11:34:39 AM by Vint »


ValeraVVV

  • Зашел в гости
  • *
  • Posts: 13
    • View Profile
Re: День недели
« Reply #6 on: May 27, 2016, 12:09:47 PM »
в инструкции к формуле упущено, что конечное число может быть минусовым.
вот тогда пришлось додумать.
можно проверить на дате 1.04.2016 

классный короткий скрипт у тебя получился. видно асса  ;D
спс огромное. себе скрипт поменяю на твой.
....
попутно, пока вникал в смысл формулы интересная вещь получается....
чтобы рассчитать надо принять за основу юлианскую систему исчисления , где март начало года и начало недели воскресенье... во как. и не надо мучений с високосным годом.....  а сейчас календари черти что.   
....
« Last Edit: May 27, 2016, 12:46:24 PM by ValeraVVV »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: День недели
« Reply #7 on: May 27, 2016, 01:08:36 PM »
Они просто решили проблему скинув 29 февраля в конец списка, чтобы он не влиял на вычисление всех других дней.
Удобно, чёрт побери.


dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: День недели
« Reply #8 on: May 27, 2016, 08:10:31 PM »
попробовал высчитать.
и о,эврика! оно поддается расчетам .
погуглив нашел несколько формул выбрал одну и в итоге родилось "нечто" :)
здоровски. я както даже и неподумал что это можно просчитать. а во как оно есть. :)

ZET

  • Зашел в гости
  • *
  • Posts: 8
    • View Profile
Re: День недели
« Reply #9 on: May 28, 2017, 06:20:43 PM »
Приветствую!
Задался вопросом получения дня недели, набросал свой вариант в две строки:

Code: (clickermann) [Select]
$nd = $_time_t - ($_time_h * 3600) - ($_time_m * 60) - $_time_s
$nd = INT(($nd - (INT($nd / 604800) * 604800)) / 86400)

SWITCH($nd)
CASE(0)
PRINT("Четверг")
CASE(1)
PRINT("Пятница")
CASE(2)
PRINT("Суббота")
CASE(3)
PRINT("Воскресенье")
CASE(4)
PRINT("Понедельник")
CASE(5)
PRINT("Вторник")
CASE(6)
PRINT("Среда")
END_SWITCH

HALT

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: День недели
« Reply #10 on: May 29, 2017, 01:23:39 PM »
Тогда уж и вывод сократить
Code: (clickermann) [Select]
STRSEPARATE("Четверг:Пятница:Суббота:Воскресенье:Понедельник:Вторник:Среда", ":", $ndt)
PRINT($ndt[$nd])