PHP verilen bir hafta numarası (multi-platform) ilk gününü nasıl alabilirim?

6 Cevap

PHP bunu yapmak için en kolay yolu nedir?

Ben bir yıl belirli bir haftada sayının Pazartesi tarihini istiyorum (örnek: 2009 hafta sayısı 3)

Teşekkürler!

EDIT: Eğer Linux sadece makine, kullanımı cletus 'çözüm, ancak ben Windows ve Linux üzerinde çalışabilir bir şey arıyorum kullanın.

6 Cevap

Yine bir başka çözüm:

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

PHP 5.3 ile ilgili basit

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

15 haftanın sayısıdır. Ama on aşağıda numarası için emin ilk hafta ve ikinci hafta için 01, 02 biçiminde olduğundan emin olun.

Çalışma ve sunucu işletim sistemi bağımlı değil gibi görünüyor:

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

?>

fikir eklemek için:

  • seçilen yılın Ocak ilk damgası
  • Günde saniye sayısı ile çarpılır ilk hafta sonunu (7 gün eksi Ocak 1 + 1 gün haftanın günü olan) ulaşmak için saniye sayısı
  • seçilen hafta sayıda eksi ilk hafta saniye numarası ve geçerli hafta
  • 1 saniye Geçerli haftanın yumruk ikinci ulaşmak için

My example returns : 1358722801 which is the timestamp of 2013/01/21 0:00:01

Burada çok basit bir çözüm yok bir hafta geçirerek, ve tarihini döndürür.

ISO8601 standardı devletlerin bu hafta 1 her zaman 4 Ocak düşer hafta düşmek.

Örneğin, yılın 4. haftasında bir gün olsun:

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

Sonra (bulabileceğiniz garanti bir başlangıç ​​yeri olarak) Pazar için bu değeri ayarlayabilirsiniz:

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

Sonra, Pazartesi almak için tekrar bir günde saniye.

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

Note: Bu yöntem bazen yaz saati ile ilgili bazı sorunlar olabilir. Benzer ve DST zaman değişiklikler arasında, yöntem kullanmak biraz daha güvenli the DateTime class. Ancak, DateTime 5.2.0 veya sonraki PHP sadece destek. Yukarıdaki yöntemi de önceki sürümünde çalışır.

Bu fonksiyonu deneyin

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 

Çalıştırdığınızda, I got:

-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

Umarım bu yardımcı olur.