datetimefilter.php 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. <?php
  2. if (!defined("CONFIG")) die("Not defined");
  3. $date_shift = getParam('date_shift', $page_url, 'h');
  4. $date_start = getParam('date_start', $page_url, '');
  5. $date_stop = getParam('date_stop', $page_url, ''); // Исправлено: было 'date_start'
  6. // Инициализация переменных
  7. $datetime_start = null;
  8. $datetime_stop = null;
  9. $time_start = null;
  10. $time_stop = null;
  11. $date1 = '';
  12. $date2 = '';
  13. $shift_array = [ 'h', '8h', 'd', 'm' ];
  14. // если время не передано или установлен интервал сдвига - обновить время
  15. if (empty($date_start) || empty($date_stop) || in_array($date_shift, $shift_array)) {
  16. // Устанавливаем конечную дату = текущее время
  17. $datetime_stop = new DateTime();
  18. $date2 = $datetime_stop->format('Y-m-d H:i');
  19. $time_stop = $datetime_stop->getTimestamp();
  20. // Устанавливаем начальную дату в зависимости от сдвига
  21. $datetime_start = clone $datetime_stop;
  22. switch ($date_shift) {
  23. case 'h':
  24. $datetime_start->modify('-1 hour');
  25. break;
  26. case '8h':
  27. $datetime_start->modify('-8 hours');
  28. break;
  29. case 'd':
  30. $datetime_start->modify('-1 day');
  31. break;
  32. case 'm':
  33. $datetime_start->modify('-1 month');
  34. break;
  35. case '-':
  36. default:
  37. $datetime_start->modify('-1 day'); // значение по умолчанию
  38. break;
  39. }
  40. $time_start = $datetime_start->getTimestamp();
  41. $date1 = $datetime_start->format('Y-m-d H:i');
  42. } else {
  43. // Если даты переданы, парсим их
  44. $datetime_start = GetDateTimeFromString($date_start);
  45. if ($datetime_start) {
  46. $date1 = $datetime_start->format('Y-m-d H:i');
  47. $time_start = $datetime_start->getTimestamp();
  48. }
  49. $datetime_stop = GetDateTimeFromString($date_stop);
  50. if ($datetime_stop) {
  51. $date2 = $datetime_stop->format('Y-m-d H:i');
  52. $time_stop = $datetime_stop->getTimestamp();
  53. }
  54. }
  55. // Защита от невалидных дат
  56. if (!$datetime_start || !$datetime_stop) {
  57. // Устанавливаем значения по умолчанию при ошибке
  58. $datetime_stop = new DateTime();
  59. $datetime_start = clone $datetime_stop;
  60. $datetime_start->modify('-1 day');
  61. $date1 = $datetime_start->format('Y-m-d H:i');
  62. $date2 = $datetime_stop->format('Y-m-d H:i');
  63. $time_start = $datetime_start->getTimestamp();
  64. $time_stop = $datetime_stop->getTimestamp();
  65. }
  66. // Проверяем что начальная дата не позже конечной
  67. if ($time_start > $time_stop) {
  68. // Меняем даты местами если нужно
  69. list($time_start, $time_stop) = [$time_stop, $time_start];
  70. list($date1, $date2) = [$date2, $date1];
  71. list($datetime_start, $datetime_stop) = [$datetime_stop, $datetime_start];
  72. }
  73. $days_shift = ceil(($time_stop - $time_start) / 86400);
  74. // Сохраняем в сессии
  75. $_SESSION[$page_url]['date_start'] = $date1;
  76. $_SESSION[$page_url]['date_stop'] = $date2;
  77. $_SESSION[$page_url]['date_shift'] = $date_shift;
  78. ?>
  79. <script>
  80. function SetDateShiftCustom() {
  81. document.getElementById('date_shift').value='-';
  82. }
  83. function updateDates() {
  84. const dateShift = document.getElementById('date_shift').value;
  85. const dateStartInput = document.getElementById('date_start');
  86. const dateStopInput = document.getElementById('date_stop');
  87. // Если выбран произвольный период - не меняем даты
  88. if (dateShift === '-') {
  89. return;
  90. }
  91. // Получаем текущую дату и время
  92. const now = new Date();
  93. // Устанавливаем конечную дату = текущее время
  94. dateStopInput.value = formatDateTimeLocal(now);
  95. // Создаем копию для начальной даты
  96. const startDate = new Date(now);
  97. // Изменяем начальную дату в зависимости от выбора
  98. switch (dateShift) {
  99. case 'h': // Последний час
  100. startDate.setHours(startDate.getHours() - 1);
  101. break;
  102. case '8h': // Последние 8 часов
  103. startDate.setHours(startDate.getHours() - 8);
  104. break;
  105. case 'd': // Последние 24 часа
  106. startDate.setDate(startDate.getDate() - 1);
  107. break;
  108. case 'm': // Последний месяц
  109. startDate.setMonth(startDate.getMonth() - 1);
  110. break;
  111. }
  112. // Устанавливаем начальную дату
  113. dateStartInput.value = formatDateTimeLocal(startDate);
  114. }
  115. // Функция для форматирования даты в формат datetime-local
  116. function formatDateTimeLocal(date) {
  117. const year = date.getFullYear();
  118. const month = String(date.getMonth() + 1).padStart(2, '0');
  119. const day = String(date.getDate()).padStart(2, '0');
  120. const hours = String(date.getHours()).padStart(2, '0');
  121. const minutes = String(date.getMinutes()).padStart(2, '0');
  122. return `${year}-${month}-${day}T${hours}:${minutes}`;
  123. }
  124. // Автоматическое обновление при загрузке страницы, если нужно
  125. /*
  126. document.addEventListener('DOMContentLoaded', function() {
  127. const dateShift = document.getElementById(date_shift).value;
  128. if (dateShift !== 'custom') {
  129. updateDates();
  130. }
  131. });
  132. */
  133. // Опционально: автоматическая отправка формы при изменении
  134. /*
  135. function updateAndSubmit() {
  136. updateDates();
  137. document.getElementById('dateForm').submit();
  138. }
  139. */
  140. </script>