Как найти день недели в php в определенном часовом поясе

96

Я запутался при использовании php для обработки даты / времени.

Я пытаюсь сделать следующее: когда пользователь посещает мою страницу, я спрашиваю его часовой пояс, а затем показываю «день недели» в его часовом поясе.

Я не хочу пользоваться браузером днем. Я хочу сделать этот расчет на php.

Вот как я пытаюсь этого добиться:

  1. Часовой пояс, введенный пользователем
  2. Отметка времени Unix, рассчитанная функцией php time ().

Но я не знаю, как действовать ... Как мне получить «день недели» в этом часовом поясе.

Мэтт Джонсон-Пинт
источник

Ответы:

145
$dw = date( "w", $timestamp);

Где $ dw будет от 0 (для воскресенья) до 6 (для субботы), как вы можете видеть здесь: http://www.php.net/manual/en/function.date.php

Ботонд Береш
источник
65
Начиная с php 5.1.0 вы можете использовать date("N", $timestamp)для получения 1..7значений, начиная с понедельника. В более старых версиях вы можете использовать эту уловку (date("w", $timestamp) + 6) % 7для получения 0..6значений, начиная с понедельника.
oluckyman
22
Я очень запуталась. Откуда столько голосов? Вопрос в том, как получить день недели в определенном часовом поясе, а не в часовом поясе веб-сервера и не в GMT. Это отвечает на первую часть вопроса, но полностью игнорирует вторую часть вопроса.
тфиннига 09
6
@tfinniga, я думаю, причина в том, что многие люди приходят к этому вопросу, когда ищут, как узнать день недели (как я), а затем голосуют за него, потому что он отвечает на их вопрос :)
dav
Имейте в виду, что date () и mktime () работают только до тех пор, пока вы перемещаетесь в эпоху UNIX (1970 - 2038 / 0x0 - 0x7FFFFFFF в секундах). Используйте новый PHP «Расширения, связанные с датой и временем»
eosphere
1
@dav Вау, наверное, ты прав, но это кажется действительно плохой причиной. Я чувствую, что начинаю формировать твердое мнение о среднем разработчике php.
tfinniga
117

Мое решение таково:

$tempDate = '2012-07-10';
echo date('l', strtotime( $tempDate));

Выход: Tuesday

$tempDate = '2012-07-10';
echo date('D', strtotime( $tempDate));

Выход: Tue

транте
источник
Это прекрасно работает. Я использовал дату ('D', strtotime ($ DATE)). Моя переменная $ DATE уже была в правильном формате. Я использовал это для определения DOW в созданной мной базе данных отчетов. При поиске по нескольким датам хорошо иметь небольшую дополнительную аббревиатуру DOW.
user208145 03
21

Я думаю, что это правильный ответ, просто измените Europe/Stockholmчасовой пояс пользователя.

$dateTime = new \DateTime(
    'now',
    new \DateTimeZone('Europe/Stockholm')
);
$day = $dateTime->format('N');

Числовое представление дня недели ISO-8601 (добавлено в PHP 5.1.0) от 1 (для понедельника) до 7 (для воскресенья)

http://php.net/manual/en/function.date.php

Список поддерживаемых часовых поясов см. На http://php.net/manual/en/timezones.php.

Cjohansson
источник
20

Большое спасибо, ребята, за ваши быстрые комментарии.

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

public function getDayOfWeek($pTimezone)
{

    $userDateTimeZone = new DateTimeZone($pTimezone);
    $UserDateTime = new DateTime("now", $userDateTimeZone);

    $offsetSeconds = $UserDateTime->getOffset(); 
    //echo $offsetSeconds;

    return gmdate("l", time() + $offsetSeconds);

}

Сообщите, если обнаружите какие-либо исправления.

Пеон
источник
9

Еще один быстрый способ:

date_default_timezone_set($userTimezone);
echo date("l");
Андре
источник
5

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

// let's say they're in the timezone GMT+10
$theirOffset = 10;  // $_GET['offset'] perhaps?
$offsetSeconds = $theirOffset * 3600;
echo gmdate("l", time() + $offsetSeconds);
Nickf
источник
3
$myTimezone = date_default_timezone_get();
date_default_timezone_set($userTimezone);
$userDay = date('l', $userTimestamp);
date_default_timezone_set($myTimezone);

Это должно работать (не тестировал, поэтому YMMV). Он работает, сохраняя текущий часовой пояс сценария, меняя его на указанный пользователем, получая день недели от date()функции с указанной меткой времени, а затем устанавливая часовой пояс сценария обратно на тот, с которого он был в начале.

Однако у вас могут быть приключения с идентификаторами часовых поясов.

Калиум
источник
2

«День недели» - это то, что вы можете получить непосредственно из функции php date () в формате «l» или «N» соответственно. Взгляните на руководство

edit: Извините, я не прочитал должным образом сообщения Kalium, он уже объяснил это. Виноват.

HerdplattenToni
источник
2

Дата проверки - понедельник или воскресенье, до последнего понедельника или последнего воскресенья.

 public function getWeek($date){
    $date_stamp = strtotime(date('Y-m-d', strtotime($date)));

     //check date is sunday or monday
    $stamp = date('l', $date_stamp);      
    $timestamp = strtotime($date);
    //start week
    if(date('D', $timestamp) == 'Mon'){            
        $week_start = $date;
    }else{
        $week_start = date('Y-m-d', strtotime('Last Monday', $date_stamp));
    }
    //end week
    if($stamp == 'Sunday'){
        $week_end = $date;
    }else{
        $week_end = date('Y-m-d', strtotime('Next Sunday', $date_stamp));
    }        
    return array($week_start, $week_end);
}
user2214236
источник
Хотя это может быть использовано, это не отвечает на вопрос.
outis
2

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

function getWeekForDate($date, $weekStartSunday = false){

    $timestamp = strtotime($date);

    // Week starts on Sunday
    if($weekStartSunday){
        $start = (date("D", $timestamp) == 'Sun') ? date('Y-m-d', $timestamp) : date('Y-m-d', strtotime('Last Sunday', $timestamp));
        $end = (date("D", $timestamp) == 'Sat') ? date('Y-m-d', $timestamp) : date('Y-m-d', strtotime('Next Saturday', $timestamp));
    } else { // Week starts on Monday
        $start = (date("D", $timestamp) == 'Mon') ? date('Y-m-d', $timestamp) : date('Y-m-d', strtotime('Last Monday', $timestamp));
        $end = (date("D", $timestamp) == 'Sun') ? date('Y-m-d', $timestamp) : date('Y-m-d', strtotime('Next Sunday', $timestamp));
    }

    return array('start' => $start, 'end' => $end);
}
Дринкинет
источник
Хотя это может быть использовано, это не отвечает на вопрос.
outis
0

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

Поскольку здесь мы говорим о датах, кажется вероятным, что основная абстракция - это ISO8601DateTime. Одна из конкретных реализаций - current datetime, та, которая вам нужна, когда a делает запрос к вашему бэкэнду, следовательно, Now()class. Второй вариант, который может вам пригодиться, - это дата и время, скорректированное на некоторый часовой пояс. Неудивительно, что это называется AdjustedAccordingToTimeZone. И, наконец, вам нужен день недели в часовом поясе прошедшего datetime: для этого есть LocalDayOfWeekкласс. Итак, код выглядит следующим образом:

(new LocalDayOfWeek(
    new AdjustedAccordingToTimeZone(
        new Now(),
        new TimeZoneFromString($_POST['timezone'])
    )
))
    ->value();

Подробнее об этом подходе читайте здесь .

Вадим Самохин
источник
-1
echo date('l', strtotime('today'));
Раафет Дхауади
источник
Хотя этот фрагмент кода может решить вопрос, включение объяснения действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин вашего предложения кода.
andreas