Як знайти день тижня у php у певному часовому поясі


95

Я розгублений під час використання 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. Це відповідає на першу частину питання, але повністю ігнорує другу частину питання.
tfinniga

6
@tfinniga, я думаю, що причина в тому, що багато людей приходять до цього питання, коли шукають, як отримати день тижня (як я це зробив), а потім проголосують, бо це відповідає на їх запитання :)
дав

Майте на увазі, що date () і mktime () працюють лише до тих пір, поки ви рухаєтеся в епоху UNIX (1970 - 2038 / 0x0 - 0x7FFFFFFF за секунди). Використовуйте новий PHP "Розширення, пов’язані з датою та часом"
еосфера

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

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


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

"День тижня" - це насправді те, що ви можете отримати безпосередньо з функції php date () у форматі "l" або "N" відповідно. Погляньте на посібник

редагувати: Вибачте, я не прочитав дописи Каліума належним чином, він це вже пояснив. Моє ліжко.


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

Стандартні подання частин дати на основі листів є чудовими, за винятком того, що вони не такі інтуїтивні. Набагато зручнішим способом є визначення основних абстракцій та низки конкретних реалізацій. Крім того, за такого підходу ви можете отримати користь від автозавершення.

Оскільки ми говоримо тут про дати, тут здається правдоподібним, що основною абстракцією є ISO8601DateTime. Однією з конкретних реалізацій є поточна дата-час, та, яка потрібна вам, коли a робить запит до вашого серверного сервера, отже, Now()класу. Другий, який корисний для вас, - це час, пристосований до певного часового поясу. Не дивно, що це називається AdjustedAccordingToTimeZone. І нарешті, вам потрібен день тижня в часовому поясі пройденої дати та часу: для цього є LocalDayOfWeekклас. Отже, код виглядає так:

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

Докладніше про цей підхід можна подивитися тут .


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

Незважаючи на те, що цей фрагмент коду може вирішити питання, включення пояснення дійсно допомагає поліпшити якість вашої публікації. Пам'ятайте, що ви будете відповідати на запитання для читачів у майбутньому, і ці люди можуть не знати причин вашої пропозиції коду.
andreas
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.