Работа с датами в php

Добавление, вычитание и сравнение дат

Можно добавлять и вычитать определенные периоды времени к и от даты. Это можно сделать с помощью функций и . Вы также можете использовать функцию , чтобы вычесть две даты и вывести разницу между ними по годам, месяцам и дням или что-то еще.

Как правило, проще провести такую арифметику, связанную с датой и временем, в объектно-ориентированном стиле с классом , а не делать это процедурно. Мы попробуем оба эти стили, и вы сможете выбрать то, что вам больше нравится.

При использовании объект , на который вызывается метод , вычитается из объекта , который передается методу . Когда вы пишете код процедурного стиля, первый параметр даты вычитается из второго параметра даты.

И функция, и метод возвращают объект , представляющий разницу между двумя датами. Этот интервал можно отформатировать, чтобы дать конкретный результат, используя все символы, перечисленные в документации метода .

Различие между объектно-ориентированным стилем и процедурным становится более очевидным при вычитании или добавлении временного интервала.

Вы можете создать экземпляр нового объекта с помощью конструктора . Аналогично, вы можете создать экземпляр объекта с помощью конструктора . Он принимает строку в качестве ее параметра. Интервальная строка начинается с , что означает период. После этого вы можете указать каждый период с использованием целочисленного значения и символа, присвоенного определенному периоду. Для получения дополнительной информации вы должны проверить документацию .

Вот пример, который иллюстрирует, как легко добавлять или вычитать даты и время в PHP.

Вы также можете сравнить даты на PHP с помощью операторов сравнения. Это может пригодиться время от времени. Давайте создадим счетчик рождественских дней, используя операторы сравнения и другие методы .

Мы начали с создания двух объектов для хранения текущего времени и даты Рождества этого года. После этого мы запускаем цикл , чтобы добавить 1 год к рождественской дате 2018 года, пока настоящая дата не станет меньше, чем дата Рождества. Это будет полезно, когда код будет запущен 18 января 2024 года. Цикл while увеличит дату Рождества, если он меньше текущей даты во время запуска этого скрипта.

Наш рождественский счетчик теперь будет работать в течение многих десятилетий без проблем.

PHP 5 Date/Time функции

Функция Описание
checkdate() Проверяет григорианскую дату
date_add() Добавляет дни, месяцы, годы, часы, минуты и секунды к дате
date_create_from_format() Возвращает новый объект DateTime, отформатированный в соответствии с указанным форматом
date_create() Возвращает новый объект DateTime
date_date_set() Устанавливает новую дату
date_default_timezone_get() Возвращает индексный часовой пояс, используемый всеми функциями даты и времени
date_default_timezone_set() Задает часовой пояс индекса, используемый всеми функциями даты и времени
date_diff() Возвращает разницу между двумя датами
date_format() Возвращает дату, отформатированную в соответствии с заданным форматом
date_get_last_errors() Возвращает предупреждения/ошибки, найденные в строке даты
date_interval_create_from_date_string() Устанавливает для dateinterval из относительной части строки
date_interval_format() Форматирует интервал
date_isodate_set() Устанавливает дату ISO
date_modify() Изменяет метку времени
date_offset_get() Возвращает смещение часового пояса
date_parse_from_format() Возвращает ассоциативный массив с подробной информацией о заданной дате в соответствии с заданным форматом
date_parse() Возвращает ассоциативный массив с подробной информацией о заданной дате
date_sub() Вычитает дни, месяцы, годы, часы, минуты и секунды из даты
date_sun_info() Возвращает массив, содержащий информацию о начале/конце заката/восхода солнца и сумерек для указанного дня и местоположения
date_sunrise() Возвращает время восхода солнца для указанного дня и местоположения
date_sunset() Возвращает время захода солнца для указанного дня и местоположения
date_time_set() Устанавливат время
date_timestamp_get() Возвращает метку времени Unix
date_timestamp_set() Устанавливает дату и время на основе временной метки Unix
date_timezone_get() Возвращает часовой пояс данного объекта DateTime
date_timezone_set() Задает часовой пояс для объекта DateTime
date() Форматирует локальную дату и время
getdate() Возвращает информацию о дате/времени метки времени или текущей локальной дате/времени
gettimeofday() Возвращает текущее время
gmdate() Форматирует дату и время GMT/UTC
gmmktime() Возвращает метку времени Unix для даты GMT
gmstrftime() Форматирует дату и время GMT/UTC в соответствии с настройками локали
idate() Форматирует местное время/дату как целое число
localtime() Возвращает местное время
microtime() Возвращает текущую метку времени Unix в микросекундах
mktime() Возвращает метку времени Unix для даты
strftime() Форматирует местное время и/или дату в соответствии с настройками локали
strptime() Анализирует время/дату, сгенерированные с помощью strftime()
strtotime() Разбирает английское текстовое представление даты в метку времени Unix
time() Возвращает текущее время в виде временной метки Unix
timezone_abbreviations_list() Возвращает ассоциативный массив, содержащий летнее время, смещение и имя часового пояса
timezone_identifiers_list() Возвращает индексированный массив со всеми идентификаторами часовых поясов
timezone_location_get() Возвращает информацию о местоположении для указанного часового пояса
timezone_name_from_ abbr() Возвращает название часового пояса из аббревиатуры
timezone_name_get() Возвращает название часового пояса
timezone_offset_get() Возвращает смещение часового пояса от GMT
timezone_open() Создает новый объект DateTimeZone
timezone_transitions_get() Возвращает все переходы для часового пояса
timezone_version_get() Возвращает версию базы данных часового пояса

Get the Unix Timestamp

Sometimes, you will need to get the value of the current Unix timestamp in PHP. This is very easy with the help of the  function. It returns an integer value which describes the number of milliseconds that have passed since 1 January 1970 at midnight (00:00:00) GMT.

You can also use this function to go back and forth in time. To do so, all you have to do is subtract the right number of seconds from the current value of  and then change the resulting value into the desired date string. Here are two examples:

One important thing you should remember is that the timestamp value returned by  is time-zone agnostic and gets the number of seconds since 1 January 1970 at 00:00:00 UTC. This means that at a particular point in time, this function will return the same value in the US, Europe, India, or Japan.

Another way to get the timestamp for a particular date would be to use the  function. When all the parameters are omitted, this function just uses the current local date and time to calculate the timestamp value. This function can also be used with  to generate useful date and time strings.

Basically,  can be used to go back and forth to a period of time, while  is useful when you want to go to a particular point in time.

Преобразование формата даты и времени в PHP

Простейший механизм, позволяющий преобразовать числовое значение даты на более понятные значения, предоставляется функцией:

Она возвращает ассоциативный массив, содержащий информацию о дате. Если параметр timestamp не указан, будут возвращены сведения о текущем времени. Этот массив содержит следующие значения:

seconds секунды (0-59)
minutes минуты (0-59)
hours часы (0-23)
mday день месяца (1-31)
wday день недели (0-6), начиная с воскресенья
mon месяц (1-12)
year год
yday день года (0-365)
weekday название дня недели (например, Monday)
month название месяца (например, January)
количество секунд, прошедших с начала Эпохи Unix

Полученный массив, позволяет вывести значения нужном виде:

Так же для преобразования формата даты и времени можно воспользоваться функцией:

Она предназначена для получения текущей даты unix timestamp в нужном формате. Строковый параметр $template определяет формат вывода. Параметром $unix_timestamp можно задать, с каким значением времени производится работа. Он необязательный, поэтому, если его не указать, будет использоваться текущая дата и время.

Формат задается следующими значениями:

a «до» и «после» полудня: «am» или «pm»
A «до» и «после» полудня заглавными буквами: «AM» или «PM»
d день месяца 2 цифрами (если меньше 10, на первом месте ноль) (от 01 до 31)
D день недели 3 буквами. Например, «Mon» (понедельник)
j день месяца, 1-2 цифры без начальных нулей (от 1 до 31)
F название месяца. Например, «January»
h час, 12-часовой формат (от 01 до 12)
H час, 24-часовой формат (от 00 до 23)
g час, 12-часовой формат без нулей (от 1 до 12)
G час, 24-часовой формат без нулей (от 0 до 23)
i минуты (от 00 до 59)
I (заглавная i) 1, если действует переход на летнее время, иначе 0
L 1, если год високосный, или 0 если не високосный
B время в формате Интернет-времени (альтернативной системы отсчета времени суток) (от 000 до 999)
T временная зона компьютера. Например, MDT
l (строчная L) день недели. Например, «Monday»
m месяц, две цифры с нулями (от 01 до 12)
n месяц, одна-две цифры без нулей (от 1 до 12)
M сокращенное наименование месяца. Например, «Jan»
t число дней в указанном месяце (от 28 до 31)
s секунды (от 0 до 59)
S англоязычный порядковый суффикс числа из двух букв («st», «nd», «rd» или «th»)
U целое число секунд, прошедших с момента начала эпохи UNIX
y год, цифровой, 2 цифры (14)
Y год, цифровой, 4 цифры (2014)
z порядковое число дня в году (от 0 до 365)
Z смешение временной зоны в секундах (от -43200 до 43200)
N порядковый номер дня недели от 1 (понедельник) до 7 (воскресенье) в соответствии со стандартом ISO-8601, (добавлен в версии PHP 5.1.0)
w порядковый номер дня недели от 0 (воскресенье) до 6 (суббота)
W порядковый номер недели года в соответствии со стандартом ISO-8601; недели начинаются с понедельника (добавлено в версии PHP 4.1.0)
o номер года в соответствии со стандартом ISO-8601. Имеет то же значение, что и Y, кроме случая, когда номер недели ISO (W) принадлежит предыдущему или следующему году; тогда будет использован год этой недели. (добавлен в версии PHP 5.1.0)
e код шкалы временной зоны. Например: UTC, GMT, Atlantic/Azores (добавлен в версии PHP 5.1.0)
O разница с временем по Гринвичу, в часах. Например: +0200
P разница с временем по Гринвичу с двоеточием между часами и минутами. Например: +02:00 (добавлено в версии PHP 5.1.3)
c дата в формате стандарта ISO 8601. Например, 2014-12-12T15:19:21+00:00 (добавлено в PHP 5)
r дата в формате » RFC 2822. Например: Thu, 21 Dec 2000 16:01:07 +0200
U количество секунд, прошедших с начала Эпохи Unix (The Unix Epoch, 1 января 1970 00:00:00 GMT)

Как видно из списка, с помощью этой функции можно получить очень много полезных данных о дате. Например:

Другие символы, входящие в шаблон, будут выведены в строке как есть. Если же потребуется ввести символ, который используется в функции как код формата, перед ними вставляется символ «\». Для значения «\n» (символ перехода на новую строку), следует указать «\\n». Таким образом, можно делать вывод целого сообщения, содержащего сведения о дате и времени:

Getting a list of available time zone identifiers

Before we look at how to set the default time zone programmatically, let’s look at how to get a list of supported time zones.

<?php

$timezone_identifiers = DateTimeZone::listIdentifiers();

foreach($timezone_identifiers as $key => $list){

echo $list . "<br/>";

}
?>

  HERE,

  • “$timezone_identifiers = DateTimeZone::listIdentifiers();” calls the listIdentifiers static method of the DateandTime Zone built in class.

    The listIdentifiers method returns a list of constants that are assigned to the variable $timezone_identifiers.

  • “foreach{…}” iterates through the numeric array and prints the values.

Assuming you saved the file list_time_zones.php in phptuts folder, browse to the URL http://localhost/phptuts/list_time_zones.php

Все способы вернуть из даты временную метку

  1. -> strtotime
  2. -> mktime
  3. -> DateTime + format
  4. -> DateTime + getTimestamp
  5. -> date_create + date_format
  6. -> online

Ещё:обратную сторону

  1. Как преобразовать дату в метку времени! Мы будем сегодня пользоваться функцией strtotime.

    Как-то затрагивали тему времени в php и сегодня нам потребовалось дату конвертировать обратно в метку времени(timestamp)!

    У есть дата такого формата… запените эту дату вместе с часами и минутами.

    2019-02-05 11:38

    Как преобразовать дату во временную метку с помощью strtotime

    Теперь напишем вот такую конструкцию — пишем функцию strtotime, двойные скобки и внутри помещаем ранее выведенную дату в таком формате, как есть… мы получим вот такую строку;

    echo strtotime(‘2019-02-05 11:38’);

    1549355880
    У нас получилось какое-то число, которое и есть метка времени(timestamp) добытая из даты.

  2. Как уже было заявлено выше … у нас есть дата вида:

    2019-02-05 11:38
    И теперь в качестве функции, которая вернет нам метку времени будем использовать mktime, но сперва нам потребуется, для этой функции, проделать пару манипуляций…
    Заменим первое значение -> все знаки(array(‘ ‘,’:’,’.’,’, ‘,)), которые, подозреваем, что есть в нашей дате, на второе значение -> перенос(-), в третьем значении дата(2019-02-05 11:38): str_replace(array(‘ ‘,’:’,’.’,’, ‘,), ‘-‘, ‘2019-02-05 11:38’)

    Разобьем с помощью explode в массив:

    explode(‘-‘, str_replace(array(‘ ‘,’:’,’.’,’, ‘,), ‘-‘, ‘2019-02-05 11:38’))

    Используем функцию list, чтобы сделать из разбитого в массив список …:

    list($year , $month , $day, $H, $i, $s) = explode(‘-‘, str_replace(array(‘ ‘,’:’,’.’,’, ‘,), ‘-‘, ‘2019-02-05 11:38’));

    и сталось вернуть временную метку из даты:

    echo mktime($H, $i, $s, $month, $day, $year);

    Результат:

    1549366680

  3. Будем использовать DateTime + format для возврата временной метки из даты!

    Пропускаем через класс DateTime + присваиваем переменной:

    $dateTime = new DateTime(‘2019-02-05 11:38’);

    format возвращаем строку даты, преобразованной согласно переданному формату и выводим:

    echo $dateTime->format(‘U’);

    Результат:

    1549366680

  4. Будем использовать DateTime + getTimestamp для возврата временной метки из даты! Все тоже самое. что и в предыдущем пункте, только вместо format используем getTimestamp

    Пропускаем через класс DateTime + присваиваем переменной:

    $dateTime = new DateTime(‘2019-02-05 11:38’);

    getTimestamp получим метку времени в стиле Unix

    echo $dateTime->getTimestamp();

    Результат:

    1549366680

  5. Функция date_create создает объект ‘дата’, с которым в дальнейшем можно выполнять некоторые операции.

    Пропускаем через функцию date_create + присваиваем переменной:

    $date = date_create(‘2019-02-05 11:38’);

    date_format строку, отформатированную в соответствии с указанным шаблоном format.

    echo date_format($date, ‘U’);

    Результат:

    1549366680
    Либо вместо date_format можно использовать date_timestamp_getecho date_timestamp_get($date);

    Результат:

    1549366680

    Думаю этих способов вернуть временную метку из даты будет достаточно!

  6. В форме ввода введите вашу дату, чтобы найти по ней временную метку — «timestamp»

Перевести метку времени timestamp в дату -> online

Раз уж выше мы сделали перевод времени в метку времени, то и можно сделать наоборот…

В форме ввода введите метку времени «timestamp», чтобы найти по ней дату.

Последняя дата редактирования : 13.02.2021 22:58
//dwweb.ru/comments_1_5/include/img/hand_no_foto.png
no
no

PHP Mktime Function

The mktime function returns the timestamp in a Unix format.

It has the following syntax.

<?php
mktime(hour, minute, second, month, day, year, is_dst);
?>

HERE,

  • “mktime(…)” is the make PHP timestamp function
  • “hour” is optional, it is the number of hour
  • “minute” is optional, it is the number of minutes
  • “second” is optional, it is the number of seconds
  • “month” is optional, it is the number of the month
  • “day” is optional, it is the number of the day
  • “year” is optional, it is the number of the year
  • “is_dst” is optional, it is used to determine the day saving time (DST). 1 is for DST, 0 if it is not and -1 if it is unknown.

Let’s now look at an example that creates a timestamp for the date 13/10/2025 using the mktime function.

<?php

echo mktime(0,0,0,10,13,2025);

?>

  HERE,

  • “0,0,0” is the hour, minute and seconds respectively.
  • “13” is the day of the month
  • “10” is the month of the year
  • “2025” is the year

Output:

1760328000

Frequently Asked Questions About date() in PHP

There are some common questions about getting different kinds of information from the  function in PHP that pop up every now and then. We will try to answer all of them here.

How Do I Get the Current Year in PHP?

You can get the current year in PHP by using  or . Using a capital Y will give you all the digits of the current year, like 2021. Using the small y will only give you the last two digits, like 21.

What Is the Right Way to Get the Current Month in PHP?

There are four different characters for getting the current month in PHP, depending on the format you want. You can use the capital letter F to get the full name of the month, like February, or get the month in a shorter three-letter format by using M.

You can also get the current month in numerical terms by using m and n, which will give you the month with and without leading zeroes respectively.

How Can I Get the Day of the Week in PHP?

You can also get the day of the week in PHP by using four different characters. The capital D will give you a three-letter representation of the day of the week, like Mon or Tue. Using an l (lowercase L) will give you the full name of the day of the week.

You can get a numerical value between  (for Sunday) and 6 (for Saturday) for the days of a week by using w.

How Do I Get the Current Time in 12-Hour Format in PHP?

You can get the current time of the day in a 12-hour format by using g or h. With g, you will get the time without any leading zeroes, while h will add some leading zeroes. The AM or PM can be added by using a (for small letters) or A (for capital letters).

Can I Get the Current Time in 24-Hour Format in PHP?

Using the characters G and H will give you the current hour of the day in 24-hour format. You won’t get any leading zeroes with G, but H will add leading zeroes.

What Is the Best Way to Escape Characters in a Date Format?

The  function accepts a string as its parameter, but many characters have a well-defined meaning, like Y for year and F for a month. This means that using these characters directly as part of a string may not always have the desired results.

If you want the  function to output these characters, then you have to escape them first. Here is an example:

Some of the characters, like t, need two backslashes because \t is meant for tabs. If possible, it is advisable to just put the regular string that you want to echo outside . Otherwise, you will be escaping a lot of characters.

Parameter Values

Parameter Description
object Required. Specifies a DateTime object returned by
date_create()
format Required. Specifies the format for the date. The following characters can be used:

  • d — The day of the month (from 01 to 31)
  • D — A textual representation of a day (three letters)
  • j — The day of the month without leading zeros (1 to 31)
  • l (lowercase ‘L’) — A full textual representation of a day
  • N — The ISO-8601 numeric representation of a day (1 for Monday, 7 for Sunday)
  • S — The English ordinal suffix for the day of the month (2 characters st, nd, rd or th. Works well with j)
  • w — A numeric representation of the day (0 for Sunday, 6 for Saturday)
  • z — The day of the year (from 0 through 365)
  • W — The ISO-8601 week number of year (weeks starting on Monday)
  • F — A full textual representation of a month (January through December)
  • m — A numeric representation of a month (from 01 to 12)
  • M — A short textual representation of a month (three letters)
  • n — A numeric representation of a month, without leading zeros (1 to 12)
  • t — The number of days in the given month
  • L — Whether it’s a leap year (1 if it is a leap year, 0 otherwise)
  • o — The ISO-8601 year number
  • Y — A four digit representation of a year
  • y — A two digit representation of a year
  • a — Lowercase am or pm
  • A — Uppercase AM or PM
  • B — Swatch Internet time (000 to 999)
  • g — 12-hour format of an hour (1 to 12)
  • G — 24-hour format of an hour (0 to 23)
  • h — 12-hour format of an hour (01 to 12)
  • H — 24-hour format of an hour (00 to 23)
  • i — Minutes with leading zeros (00 to 59)
  • s — Seconds, with leading zeros (00 to 59)
  • u — Microseconds (added in PHP 5.2.2)
  • e — The timezone identifier (Examples: UTC, GMT, Atlantic/Azores)
  • I (capital i) — Whether the date is in daylights savings time (1 if Daylight Savings Time, 0 otherwise)
  • O — Difference to Greenwich time (GMT) in hours (Example: +0100)
  • P — Difference to Greenwich time (GMT) in hours:minutes (added in PHP 5.1.3)
  • T — Timezone abbreviations (Examples: EST, MDT)
  • Z — Timezone offset in seconds. The offset for timezones west of UTC is negative (-43200 to 50400)
  • c — The ISO-8601 date (e.g. 2013-05-05T16:34:42+00:00)
  • r — The RFC 2822 formatted date (e.g. Fri, 12 Apr 2013 12:01:05 +0200)
  • U — The seconds since the Unix Epoch (January 1 1970 00:00:00 GMT)

and the following predefined constants can also be used (available since PHP 5.1.0):

  • DATE_ATOM — Atom (example: 2013-04-12T15:52:01+00:00)
  • DATE_COOKIE — HTTP Cookies (example: Friday, 12-Apr-13 15:52:01 UTC)
  • DATE_ISO8601 — ISO-8601 (example: 2013-04-12T15:52:01+0000)
  • DATE_RFC822 — RFC 822 (example: Fri, 12 Apr 13 15:52:01 +0000)
  • DATE_RFC850 — RFC 850 (example: Friday, 12-Apr-13 15:52:01 UTC)
  • DATE_RFC1036 — RFC 1036 (example: Fri, 12 Apr 13 15:52:01 +0000)
  • DATE_RFC1123 — RFC 1123 (example: Fri, 12 Apr 2013 15:52:01 +0000)
  • DATE_RFC2822 — RFC 2822 (Fri, 12 Apr 2013 15:52:01 +0000)
  • DATE_RFC3339 — Same as DATE_ATOM (since PHP 5.1.3)
  • DATE_RSS — RSS (Fri, 12 Aug 2013 15:52:01 +0000)
  • DATE_W3C — World Wide Web Consortium (example: 2013-04-12T15:52:01+00:00)

Функция PHP mktime()

Необязательный параметр функции указывает временную метку. Если она не указано, будут использоваться текущая дата и время (как в примерах выше).

Но если вам нужно получить метку времени в прошлом или будущем, то сделать это можно с помощью функции . Вам нужно указать нужную дату, и она возвращается с меткой времени Unix. Метка времени Unix содержит количество секунд между эпохой Unix (1 января 1970 г., 00:00:00 GMT) и указанным временем.

Синтаксис данной функции следующий:

mktime(hour, minute, second, month, day, year)

Здесь используются следующие данные:

Количество часов, прошедших с начала дня, указанного параметрами month, day и year.
Количество минут, прошедших от начала часа, указанного параметром hour.
Количество секунд, прошедших от начала минуты, указанной параметром minute.
Количество месяцев, прошедших с конца предыдущего года.
Количество дней, прошедших с конца предыдущего месяца.
Номер года, может быть указан двумя или четырьмя цифрами.

Аргументы могут быть опущены в порядке справа налево. В этом случае их значения по умолчанию равны соответствующим компонентам локальной даты/времени.

Функцию удобно использовать для выполнения арифметических операций с датами, так как она вычисляет верные значения при некорректных аргументах. Например, в следующем примере каждая строка выведет «Jan-01-1921»:

Поробуй сам

Если вы хотите получить дату завтрашнего дня, вы можете использовать следующий код:

Поробуй сам

В приведенном примере мы использовали функцию и добавили 1 день к параметру дня, чтобы получить дату завтрашнего дня.

Функция переводит заданную дату в формат . Формат timestamp — это количество секунд, прошедшее с 1-го января 1970 года по заданный момент времени.

В следующем примере получим разницу в секундах между 1970 годом и 31.12.2025, 12:59:59:

Formatting the Dates and Times with PHP

The format parameter of the function is in fact a string that can contain multiple characters allowing you to generate a date string containing various components of the date and time, like day of the week, AM or PM, etc. Here are some the date-related formatting characters that are commonly used in format string:

  • d — Represent day of the month; two digits with leading zeros (01 or 31)
  • D — Represent day of the week in text as an abbreviation (Mon to Sun)
  • m — Represent month in numbers with leading zeros (01 or 12)
  • M — Represent month in text, abbreviated (Jan to Dec)
  • y — Represent year in two digits (08 or 14)
  • Y — Represent year in four digits (2008 or 2014)

The parts of the date can be separated by inserting other characters, like hyphens (), dots (), slashes (), or spaces to add additional visual formatting.

Tip: You can use the PHP function to automatically update the copyright duration on your website, like:

Similarly you can use the following characters to format the time string:

  • h — Represent hour in 12-hour format with leading zeros (01 to 12)
  • H — Represent hour in in 24-hour format with leading zeros (00 to 23)
  • i — Represent minutes with leading zeros (00 to 59)
  • s — Represent seconds with leading zeros (00 to 59)
  • a — Represent lowercase ante meridiem and post meridiem (am or pm)
  • A — Represent uppercase Ante meridiem and Post meridiem (AM or PM)

The PHP code in the following example displays the date in different formats:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector