Как найти день недели в php в определенном часовом поясе - PullRequest
91 голосов
/ 03 апреля 2009

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

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

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

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

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

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

Ответы [ 11 ]

141 голосов
/ 03 апреля 2009
$dw = date( "w", $timestamp);

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

113 голосов
/ 10 июля 2012

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

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

Вывод: Tuesday

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

Вывод: Tue

20 голосов
/ 03 апреля 2009

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

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

public function getDayOfWeek($pTimezone)
{

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

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

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

}

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

17 голосов
/ 25 октября 2016

Я думаю, что это правильный ответ, просто измените 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

8 голосов
/ 19 октября 2010

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

date_default_timezone_set($userTimezone);
echo date("l");
5 голосов
/ 03 апреля 2009

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

// let's say they're in the timezone GMT+10
$theirOffset = 10;  // $_GET['offset'] perhaps?
$offsetSeconds = $theirOffset * 3600;
echo gmdate("l", time() + $offsetSeconds);
3 голосов
/ 03 апреля 2009
$myTimezone = date_default_timezone_get();
date_default_timezone_set($userTimezone);
$userDay = date('l', $userTimestamp);
date_default_timezone_set($myTimezone);

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

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

2 голосов
/ 09 апреля 2014

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

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);
}
2 голосов
/ 24 декабря 2013

Проверьте дату понедельника или воскресенья, прежде чем получите последний понедельник или последнее воскресенье

 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);
}
2 голосов
/ 03 апреля 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...