특정 시간대의 PHP에서 요일을 찾는 방법


95

날짜 / 시간을 처리하기 위해 PHP를 사용하는 동안 혼란 스럽습니다.

내가하려는 것은 이것이다 : 사용자가 내 페이지를 방문 할 때 나는 그의 시간대를 묻고 그의 시간대에 '요일'을 표시합니다.

나는 브라우저의 날을 사용하고 싶지 않습니다. 이 계산을 PHP에서하고 싶습니다.

이것이 내가 그것을 달성하려는 방법입니다.

  1. 사용자가 입력 한 시간대
  2. php time () 함수로 계산 된 Unix 타임 스탬프.

하지만 어떻게 진행해야할지 모르겠습니다.이 시간대에서 '요일'을 어떻게 얻을 수 있을까요?

답변:


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가 아닌 웹 서버의 시간대가 아닌 특정 시간대의 요일을 가져 오는 방법입니다. 이것은 질문의 첫 번째 부분에 대한 대답이지만 질문의 두 번째 부분은 완전히 무시합니다.
tfinniga 2013 년

6
@tfinniga, 그 이유는 많은 사람들이 요일을 얻는 방법을 검색 할 때 (내가 한 것처럼)이 질문을 찾은 다음 질문에 답하기 때문에 투표하기 때문이라고 생각합니다. :)
dav

date () 및 mktime ()은 UNIX 시대 (1970-2038 / 0x0-0x7FFFFFFF (초)) 내에서 이동하는 동안에 만 작동합니다. 새로운 PHP "날짜 및 시간 관련 확장"사용
eosphere

1
@dav 와우, 당신 말이 맞을 것 같지만, 정말 나쁜 이유 인 것 같습니다. 평범한 PHP 개발자에 대한 강력한 의견을 개발하기 시작하는 것 같습니다.
tfinniga 2015-04-17

117

내 해결책은 다음과 같습니다.

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

출력은 다음과 같습니다. Tuesday

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

출력은 다음과 같습니다. Tue


이것은 아름답게 작동합니다. 나는 date ( 'D', strtotime ($ DATE))를 사용했습니다. 내 $ DATE 변수가 이미 올바른 형식이었습니다. 나는 이것을 사용하여 내가 만든보고 데이터베이스에서 DOW를 식별했습니다. 여러 날짜를 검색 할 때 약간의 추가 DOW 약어를 사용하는 것이 좋습니다.
user208145


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);

3
$myTimezone = date_default_timezone_get();
date_default_timezone_set($userTimezone);
$userDay = date('l', $userTimestamp);
date_default_timezone_set($myTimezone);

이것은 작동합니다 (테스트하지 않았으므로 YMMV). 스크립트의 현재 시간대를 저장하고 사용자가 지정한 시간대로 변경하고date() , 지정된 타임 스탬프 함수에서 다음 스크립트의 시간대를 원래의 시간대로 다시 설정하여 작동합니다.

하지만 시간대 식별자로 모험을 할 수도 있습니다.


2

"요일"은 실제로 각각 "l"또는 "N"형식으로 php date () 함수에서 직접 얻을 수있는 것입니다. 매뉴얼을 보세요

편집 : Kalium의 게시물을 제대로 읽지 못해 미안합니다. 그는 이미 설명했습니다. 내 잘못이야.


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);
}

이것은 용도가있을 수 있지만 질문에 대한 대답은 아닙니다.
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

날짜 부분의 표준 문자 기반 표현은 매우 직관적이지 않다는 점을 제외하면 훌륭합니다. 훨씬 더 편리한 방법은 기본 추상화와 여러 특정 구현을 식별하는 것입니다. 게다가이 접근 방식을 사용하면 자동 완성을 통해 이점을 얻을 수 있습니다.

여기서 datetimes에 대해 이야기하고 있기 때문에 기본 추상화가 ISO8601DateTime. 특정 구현 중 하나는 현재 날짜 시간으로, 백엔드에 요청을 할 때 필요한 것이므로 Now()클래스입니다. 두 번째는 일부 시간대로 조정 된 datetime입니다. 당연히 AdjustedAccordingToTimeZone. 마지막으로, 전달 된 datetime 시간대의 요일이 필요 LocalDayOfWeek합니다.이를위한 클래스가 있습니다. 따라서 코드는 다음과 같습니다.

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

이 접근 방식에 대한 자세한 내용은 여기를 참조하십시오 .


-1
echo date('l', strtotime('today'));

이 코드 스 니펫은 질문을 해결할 수 있지만 설명을 포함하면 게시물의 품질을 개선하는 데 실제로 도움이됩니다. 미래에 독자를 위해 질문에 답하고 있으며 해당 사용자는 코드 제안 이유를 모를 수 있습니다.
andreas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.