Cách tìm ngày trong tuần bằng php trong một múi giờ cụ thể


95

Tôi bối rối khi sử dụng php để xử lý ngày / giờ.

Điều tôi đang cố gắng làm là: Khi một người dùng truy cập trang của tôi, tôi sẽ hỏi múi giờ của họ và sau đó hiển thị 'ngày trong tuần' theo múi giờ của họ.

Tôi không muốn sử dụng ngày của trình duyệt. Tôi muốn thực hiện phép tính này trong php.

Đây là cách tôi đang cố gắng đạt được nó:

  1. Múi giờ do người dùng nhập
  2. Dấu thời gian Unix được tính bằng hàm php time ().

Nhưng tôi không biết phải tiếp tục như thế nào ... Làm cách nào để tôi có được 'ngày trong tuần' ở múi giờ này.

Câu trả lời:


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

Trong đó $ dw sẽ từ 0 (cho Chủ nhật) đến 6 (cho thứ Bảy) như bạn có thể xem tại đây: http://www.php.net/manual/en/ Chức năng.date.php


65
Kể từ php 5.1.0, bạn có thể sử dụng date("N", $timestamp)để nhận 1..7các giá trị bắt đầu từ thứ Hai. Trong các phiên bản cũ hơn, bạn có thể sử dụng thủ thuật (date("w", $timestamp) + 6) % 7để nhận 0..6các giá trị bắt đầu từ Thứ Hai.
oluckyman

22
Tôi rất bối rối. Làm thế nào mà điều này có nhiều phiếu bầu như vậy? Câu hỏi đặt ra là làm thế nào để lấy ngày trong tuần ở một múi giờ cụ thể, không phải múi giờ của máy chủ web và không phải GMT. Điều này trả lời phần đầu tiên của câu hỏi, nhưng hoàn toàn bỏ qua phần thứ hai của câu hỏi.
tfinniga

6
@tfinniga, tôi nghĩ lý do là nhiều người đến câu hỏi này khi tìm kiếm cách lấy ngày trong tuần (như tôi đã làm), và sau đó bỏ phiếu vì nó trả lời câu hỏi của họ :)
dav

Lưu ý rằng date () và mktime () chỉ hoạt động miễn là bạn di chuyển trong kỷ nguyên UNIX (1970 - 2038 / 0x0 - 0x7FFFFFFF trong vài giây). Sử dụng PHP mới "Phần mở rộng liên quan đến ngày và giờ"
eosphere

1
@dav Chà, bạn có thể đúng, nhưng đó có vẻ là một lý do thực sự tồi tệ. Tôi cảm thấy như tôi đang bắt đầu phát triển những ý kiến ​​mạnh mẽ về nhà phát triển php trung bình.
tfinniga

117

Giải pháp của tôi là:

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

Đầu ra là: Tuesday

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

Đầu ra là: Tue


Điều này hoạt động tuyệt vời. Tôi đã sử dụng date ('D', strtotime ($ DATE)). Biến $ DATE của tôi đã ở đúng định dạng. Tôi đã sử dụng điều này để xác định DOW trong cơ sở dữ liệu báo cáo mà tôi đã tạo. Khi tìm kiếm trên nhiều ngày, việc có thêm chữ viết tắt DOW nhỏ đó là một điều tuyệt vời.
user208145,

21

Tôi nghĩ đây là câu trả lời chính xác, chỉ cần thay đổi Europe/Stockholmmúi giờ của người dùng.

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

ISO-8601 đại diện số của ngày trong tuần (được thêm vào PHP 5.1.0) 1 (cho Thứ Hai) đến 7 (cho Chủ Nhật)

http://php.net/manual/en/ Chức năng.date.php

Để biết danh sách các múi giờ được hỗ trợ, hãy xem http://php.net/manual/en/timezones.php


20

Cảm ơn rất nhiều người đã bình luận nhanh chóng của bạn.

Đây là những gì tôi sẽ sử dụng bây giờ. Đăng chức năng ở đây để ai đó có thể sử dụng nó.

public function getDayOfWeek($pTimezone)
{

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

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

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

}

Báo cáo nếu bạn tìm thấy bất kỳ sửa chữa.


9

Một cách nhanh chóng khác:

date_default_timezone_set($userTimezone);
echo date("l");

5

Nếu bạn có thể nhận được chênh lệch múi giờ của họ, bạn chỉ có thể thêm nó vào dấu thời gian hiện tại và sau đó sử dụng hàm gmdate để lấy giờ địa phương của họ.

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

Điều này sẽ hoạt động (không kiểm tra nó, vì vậy YMMV). Nó hoạt động bằng cách lưu trữ múi giờ hiện tại của tập lệnh, thay đổi nó thành múi giờ do người dùng chỉ định, lấy ngày trong tuần từ date()hàm tại dấu thời gian được chỉ định, sau đó đặt múi giờ của tập lệnh trở lại như ban đầu.

Tuy nhiên, bạn có thể có một số cuộc phiêu lưu với số nhận dạng múi giờ.


2

"Ngày trong tuần" thực sự là thứ bạn có thể lấy trực tiếp từ hàm date () php với định dạng tương ứng là "l" hoặc "N". Hãy xem hướng dẫn sử dụng

chỉnh sửa: Xin lỗi, tôi đã không đọc các bài viết của Kalium một cách chính xác, anh ấy đã giải thích điều đó. Lỗi của tôi.


2

Ngày kiểm tra là thứ hai hoặc chủ nhật trước khi nhận được thứ hai cuối cùng hoặc chủ nhật cuối cùng

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

Mặc dù điều này có thể có công dụng, nhưng nó không trả lời câu hỏi.
outis

2

Dựa trên một trong các giải pháp khác có cờ để chuyển đổi giữa các tuần bắt đầu từ Chủ nhật hoặc Thứ hai

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

Mặc dù điều này có thể có công dụng, nhưng nó không trả lời câu hỏi.
outis

0

Các biểu diễn tiêu chuẩn dựa trên chữ cái của các phần ngày là rất tốt, ngoại trừ thực tế là chúng không trực quan. Cách thuận tiện hơn nhiều là xác định các yếu tố trừu tượng cơ bản và một số cách triển khai cụ thể. Ngoài ra, với cách tiếp cận này, bạn có thể hưởng lợi từ việc tự động hoàn thành.

Vì chúng ta đang nói về ngày giờ ở đây, nên có vẻ hợp lý rằng điều trừu tượng cơ bản là ISO8601DateTime. Một trong những cách triển khai cụ thể là datetime hiện tại, cái mà bạn cần khi thực hiện yêu cầu đối với phần phụ trợ của bạn, do đó là Now()lớp. Điều thứ hai có ích cho bạn là ngày giờ được điều chỉnh theo múi giờ nào đó. Không ngạc nhiên, nó được gọi là AdjustedAccordingToTimeZone. Và cuối cùng, bạn cần một ngày trong tuần theo múi giờ của datetime đã qua: có một LocalDayOfWeeklớp học cho điều đó. Vì vậy, mã trông giống như sau:

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

Để biết thêm về cách tiếp cận này, hãy xem ở đây .


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

Mặc dù đoạn mã này có thể giải quyết câu hỏi, bao gồm một lời giải thích thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho người đọc trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn.
andreas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.