php 程序查找我的生日,其中日期名称为“星期一”再过100年

发布于 2024-11-15 03:40:54 字数 693 浏览 4 评论 0原文

我出生于1986年4月21日,星期一。我的下一个生日(日期名称为“星期一”)是 1997 年 4 月 21 日,依此类推。

我编写了一个程序来查找最多 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年之前的生日呢?

I was born in 1986-04-21, which is Monday. My next birthday with day name "Monday" is 1997-04-21 and so on.

I wrote the program to find upto 100 year to find which year my birthday comes with matching day name that is monday.

This is the code:

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

This is the output of the program:

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

Now my problem is why PHP is not supporting before 1970 and after 2040.
So how can I get the birthday after 2040 or before 1970?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

滥情稳全场 2024-11-22 03:40:54

根本不需要使用任何特殊的日期处理类或函数。

您的生日在二月的闰日之后,因此从一年到下一年,生日会比一周中晚一天 (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。

There's no need to use any special date processing classes or functions at all.

Your birthday is after the leap day in February, so from one year to the next it'll either be one day (365 % 7) or (on leap years) two days (366 % 7) later in the week than it was the year before.

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

This code will work on any version of PHP.

红ご颜醉 2024-11-22 03:40:54

如果您使用的是 PHP 5.3,则可以使用 DateTime 类并添加 DateIntervals。它基于 64 位整数,并且不存在2038 年问题

基本示例:

<?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() 的文档位于此处。

If you're on PHP 5.3, you can use the DateTime class and add DateIntervals. It is based on 64-bit integers and doesn't have the year 2038 problem.

Basic example:

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

documentation on createFromDateString() is here.

无法回应 2024-11-22 03:40:54

要了解为什么不能前往 1970 年之前或 2038 年之后,请参阅日期手册

时间戳的有效范围是
通常从 1901 年 12 月 13 日星期五开始
格林尼治标准时间 20:45:54 至 2038 年 1 月 19 日星期二
格林威治标准时间 03:14:07。 (这些是日期
对应于最小值和
32 位有符号的最大值
整数)。然而,在 PHP 5.1.0 之前
此范围自 1970 年 1 月 1 日起受到限制
在某些系统上截止到 2038 年 1 月 19 日(例如
Windows)。

For the reason why you can't go before 1970 or past 2038 see the date manual:

The valid range of a timestamp is
typically from Fri, 13 Dec 1901
20:45:54 GMT to Tue, 19 Jan 2038
03:14:07 GMT. (These are the dates
that correspond to the minimum and
maximum values for a 32-bit signed
integer). However, before PHP 5.1.0
this range was limited from 01-01-1970
to 19-01-2038 on some systems (e.g.
Windows).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文