2011-06-13 13 views
4

我出生於1986-04-21,這是星期一。我的下一個生日的日期名稱爲「星期一」,是1997-04-21等等。php程序找到我的生日,其中的星期一名稱「Monday」爲另一個100年

我寫了程序找到100年來找到哪一年我的生日與匹配的星期一名稱是星期一。

這是代碼:

<?php 
date_default_timezone_set('Asia/Calcutta'); 
for($year = 1986; $year < 2086; $year++) { 
    $timestamp = mktime(0, 0, 0, 4, 21, $year); 
    if(date('l', $timestamp) == 'Monday') { 
     echo date('Y-m-d, l', $timestamp) . "\n"; 
    } 
} 
?> 

這是程序的輸出:

1986-04-21, Monday 
1997-04-21, Monday 
2003-04-21, Monday 
2008-04-21, Monday 
2014-04-21, Monday 
2025-04-21, Monday 
2031-04-21, Monday 
2036-04-21, Monday 

現在我的問題是,爲什麼PHP是不是1970年之前和之後的2040年
支持那麼如何我可以在2040年之後或1970年之前獲得生日嗎?

+1

這可能是您的問題:http://blogs.sitepoint.com/is-your-php-application-affected-by-the-y2k38-bug/ – ngen 2011-06-13 19:16:43

回答

6

根本不需要使用任何特殊的日期處理類或函數。

你的生日是在二月的閏日之後,因此從一年到下一天,它將在一週後的一天(365%7)或(閏年)兩天(366%7)比前一年還要多。

$year = 1985; // start year 
$dow = 0;  // 0 for 1985-04-21 (Sunday) 

while ($year < 2100) { 

    $year++; $dow++; 

    if ($year % 4 == 0 && ($year % 100 != 0 || $year % 400 == 0)) { 
     $dow++; // leap year 
    } 

    $dow %= 7;  // normalise back to Sunday -> Saturday 
    if ($dow == 1) { 
     printf("%04d-%02d-%02d is a Monday\n", $year, 4, 21); 
    } 
} 

此代碼可用於任何版本的PHP。

+0

+1適用於獨立於庫的解決方案 – 2011-06-13 19:19:28

5

如果您使用PHP 5.3,則可以使用DateTime類並添加DateInterval s。它基於64位整數,並沒有year 2038 problem

基本例如:

<?php 

$year = DateInterval::createFromDateString('1 year'); 

$date = new DateTime('1986-04-21'); 
$date->add($year); 
echo $date->format('Y-m-d') . "\n"; // Repeat 100 times 

文檔上createFromDateString()here

1

爲什麼你不能1970年過去的2038之前走的理由看date manual

時間戳的有效範圍是 一般從星期五,1901年12月13日20時45分54秒 GMT到2038年1月19日星期二 03:14:07 GMT。 (這些是日期 ,對應於32位帶符號整數的最小值和最大值 )。但是,在PHP 5.1.0 之前,在一些系統上(例如,Windows的 ),該範圍從01-01-1970 到19-01-2038被限制。

相關問題