2009-11-02 36 views
9

Cách đơn giản nhất để làm điều đó trong PHP là gì?Làm thế nào để có được ngày đầu tiên của một số tuần nhất định trong PHP (đa nền tảng)?

Tôi muốn ngày thứ Hai của một số tuần nhất định trong một năm (ví dụ: số tuần 3 của năm 2009)

Cảm ơn!

EDIT: Nếu bạn chỉ sử dụng các máy Linux, hãy sử dụng giải pháp của cletus, tuy nhiên tôi đang tìm một thứ có thể hoạt động trên Windows và Linux.

Trả lời

10

Tuy nhiên, một giải pháp:

<?php 
     $week = 3; 
     $year = 2009; 

     $timestamp = mktime(0, 0, 0, 1, 1, $year) + ($week * 7 * 24 * 60 * 60); 
     $timestamp_for_monday = $timestamp - 86400 * (date('N', $timestamp) - 1); 
     $date_for_monday = date('Y-m-d', $timestamp_for_monday); 
?> 
+1

Đây là giải pháp làm việc đơn giản nhất hiện nay trên cả nền tảng Linux và Windows của tôi. – Amadeus45

+0

'ngày ('U', $ timestamp)' có thể được rút ngắn thành '$ timestamp'. – deceze

+0

Cập nhật theo đề xuất của lừa đảo. –

3

Bạn có thể sử dụng strptime() để nhận thời gian.

$time = strptime('1 23 2009', '%w %U %Y'); 

này sẽ có được thời gian cho thứ Hai (ngày 1, 0 là chủ nhật, 6 là thứ bảy) trong tuần thứ 23 của năm 2009. Nếu bạn muốn định dạng này vào một ngày, sử dụng date().

$date = date('d F Y', $time); 
+0

+1: Cách của bạn là dễ dàng hơn nhiều so với của tôi : D – NawaMan

+0

Yea, nói trong các ghi chú của trang PHP.net: không hoạt động trên Windows. – seanmonstar

+0

Trong PHP> = 5.3, có vẻ như đối tượng DateTime chứa chức năng này, trên các cửa sổ. http://www.php.net/manual/en/datetime.createfromformat.php – gnud

0

Đây là giải pháp rất đơn giản, qua một tuần không và trả về ngày.

Tiêu chuẩn ISO8601 cho biết tuần 1 luôn rơi vào tuần mà ngày 4 tháng 1 giảm.

Ví dụ, để có được một ngày trong tuần thứ 4 của năm:

$day_in_week = strtotime("2006-01-04 + 4 weeks")); 

Sau đó, bạn có thể điều chỉnh giá trị này đến chủ nhật (như là một nơi bắt đầu, bạn có thể đảm bảo rằng bạn có thể tìm thấy):

// Find that day's day of the week (value of 0-6) 
$wday = date('w', $day_in_week); 
$offset = 6 - $wday; // How far it is from Sunday. 
$sunday_in_week = $day_in_week - ($offset * (60 * 60 * 24)); // $offset * seconds in a day 

Sau đó, bạn thêm giây trong một lần nữa để nhận thứ Hai.

$monday_in_week = $sunday_in_week + (60 * 60 * 24); 

Lưu ý: Phương pháp này đôi khi có thể có một số vấn đề với thời gian tiết kiệm ánh sáng ban ngày. Tương tự, và an toàn hơn một chút giữa các thay đổi thời gian DST, phương pháp sẽ sử dụng the DateTime class. Tuy nhiên, DateTime chỉ hỗ trợ trong PHP 5.2.0 trở lên. Phương thức trên cũng hoạt động ở phiên bản cũ hơn.

0

Hãy thử chức năng này

function MondayOfWeek($WeekNumber, $Year=-1) { 
    if ($Year == -1) $Year = 0+date("Y"); 
    $NewYearDate    = mktime(0,0,0,1,1,$Year); 
    $FirstMondayDate   = 7 + 1 - date("w", mktime(0,0,0,1,1,2009)); 
    $Dates_fromFirstMonday = 7 * $WeekNumber; 
    $Second_fromFirstMonday = 60*60*24*($FirstMondayDate + $Dates_fromFirstMonday); 
    $MondayDay_ofWeek  = $NewYearDate + $Second_fromFirstMonday; 
    $Date_ofMondayDay_ofWeek = 0+date("j", $MondayDay_ofWeek); 
    return $Date_ofMondayDay_ofWeek; 
} 

for($i = 0; $i

Khi chạy, tôi nhận:

-5-12-19-26-2-9-16-23-2-9-16-23-30-6-13-20-27-4-11-18-25-1-8-15-22-29-6-13-20-27-3-10-17-24-31-7-14-21-28-5-12-19-26-2-9-16-23-30-7-14-21-28 

Hope this helps.

1

vẻ khi được làm việc và không phụ thuộc của hệ điều hành máy chủ:

<?php 

    $week = 4; 
    $year = 2013; 

    $timestamp_for_monday = mktime(0, 0, 0, 1, 1, $year) + ((7+1-(date('N', mktime(0, 0, 0, 1, 1, $year))))*86400) + ($week-2)*7*86400 + 1 ; 

?> 

ý tưởng là để thêm:

  • dấu thời gian của đầu tiên của tháng của năm chọn
  • sự số giây để đến cuối tuần đầu tiên (tức là 7 ngày trừ ngày trong tuần của ngày 1 tháng 1 + 1 ngày) nhân với số giây mỗi ngày
  • số e giây của số tuần chọn trừ tuần đầu tiên và tuần hiện tại
  • 1 giây để đạt được thứ hai nắm tay của tuần hiện tại

Ví dụ của tôi trả: 1358722801 đó là dấu thời gian năm 2013/01/21 0:00:01

41

Nó đơn giản trên PHP 5,3

echo date('M d',strtotime('2013W15')); 

nơi 15 là số tuần. Nhưng đối với con số dưới đây, hãy đảm bảo rằng nó ở định dạng 01, 02 cho tuần đầu tiên và tuần thứ hai.

+0

Tôi không thấy bất kỳ vấn đề nào khi sử dụng với PHP 5.2 hoặc 5.1. Làm việc tuyệt vời cho tôi và tôi đang sử dụng 5.2.18 tôi nghĩ vậy. Cảm ơn cho phím tắt này! – Metropolis

5

Cách tốt nhất để làm điều này một cách rõ ràng là sử dụng lớp DateTime php.

$year = 2015; 
$week_no = 1; 

$date = new DateTime(); 
$date->setISODate($year,$week_no); 
echo $date->format('d-M-Y'); 

này sẽ cho kết quả thành: 29-12-2014

1

kịch bản tiếp theo này cho 7 ngày của một tuần cụ thể của một năm

$time = new DateTime(); 
$time->setISODate(2016, 13); 
for($i=0;$i<7;$i++){ 
    echo $time->format('d-M-Y') . '<br />'; 
    $time->add(new DateInterval('P1D')); 
} 
Các vấn đề liên quan