如何在特定时区的php中查找星期几

Posted

技术标签:

【中文标题】如何在特定时区的php中查找星期几【英文标题】:How to find day of week in php in a specific timezone 【发布时间】:2010-10-17 07:11:29 【问题描述】:

我在使用 php 处理日期/时间时感到困惑。

我想要做的是:当用户访问我的页面时,我询问他的时区,然后在他的时区显示“星期几”。

我不想使用浏览器的日子。 我想在 php 中做这个计算。

这就是我试图实现它的方式:

    用户输入的时区 通过 php time() 函数计算的 Unix 时间戳

但我不知道如何继续...... 我将如何在这个时区获得“星期几”。

【问题讨论】:

【参考方案1】:
$myTimezone = date_default_timezone_get();
date_default_timezone_set($userTimezone);
$userDay = date('l', $userTimestamp);
date_default_timezone_set($myTimezone);

这应该可以工作(没有测试它,所以 YMMV)。它的工作原理是存储脚本的当前时区,将其更改为用户指定的时区,从 date() 函数中获取指定时间戳的星期几,然后将脚本的时区设置回开始时的时区.

不过,您可能会有一些使用时区标识符的冒险经历。

【讨论】:

【参考方案2】:

如果您可以获取他们的时区偏移量,您只需将其添加到当前时间戳,然后使用gmdate 函数即可获取他们的本地时间。

// let's say they're in the timezone GMT+10
$theirOffset = 10;  // $_GET['offset'] perhaps?
$offsetSeconds = $theirOffset * 3600;
echo gmdate("l", time() + $offsetSeconds);

【讨论】:

【参考方案3】:

“星期几”实际上是您可以直接从 php date() 函数中获取的内容,格式分别为“l”或“N”。看一下 the manual

编辑:对不起,我没有正确阅读 Kalium 的帖子,他已经解释过了。我的错。

【讨论】:

【参考方案4】:
$dw = date( "w", $timestamp);

如您在此处看到的,其中 $dw 将为 0(星期日)到 6(星期六): http://www.php.net/manual/en/function.date.php

【讨论】:

从 php 5.1.0 开始,您可以使用 date("N", $timestamp) 从星期一开始获取 1..7 值。在旧版本中,您可以使用技巧 (date("w", $timestamp) + 6) % 7 从星期一开始获取 0..6 值。 我很困惑。这怎么会有这么多票?问题是如何获取特定时区的星期几,而不是网络服务器的时区,而不是 GMT。这回答了问题的第一部分,但完全忽略了问题的第二部分。 @tfinniga,我认为原因是很多人在搜索如何获得星期几(就像我一样)时会提出这个问题,然后投票,因为它回答了他们的问题:) 请注意,date() 和 mktime() 仅在您在 UNIX 时代(1970 - 2038 / 0x0 - 0x7FFFFFFF 以秒为单位)内移动时才有效。使用新的 PHP“日期和时间相关扩展” @dav 哇,你可能是对的,但这似乎是一个非常糟糕的理由。我觉得我开始对普通的 php 开发人员产生强烈的看法。【参考方案5】:

非常感谢你们的快速cmets。

这就是我现在要使用的。 在此处发布该功能,以便有人可以使用它。

public function getDayOfWeek($pTimezone)


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

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

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


如果您发现任何更正,请报告。

【讨论】:

【参考方案6】:

另一种快捷方式:

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

【讨论】:

【参考方案7】:

我的解决办法是这样的:

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

输出为:Tuesday

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

输出为:Tue

【讨论】:

这很好用。我使用了日期('D',strtotime($DATE))。我的 $DATE 变量的格式已经正确。我用它来识别我制作的报告数据库中的 DOW。在跨多个日期进行搜索时,有一点额外的 DOW 缩写很好。【参考方案8】:

在获取上周一或上周日之前检查日期是周一或周日

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

【讨论】:

虽然这可能有用,但它不能回答问题。【参考方案9】:

基于其他解决方案之一,带有从周日或周一开始在周之间切换的标志

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

【讨论】:

虽然这可能有用,但它不能回答问题。【参考方案10】:
echo date('l', strtotime('today'));

【讨论】:

虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。【参考方案11】:

我认为这是正确的答案,只需将Europe/Stockholm 更改为用户时区即可。

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

星期几的 ISO-8601 数字表示(在 PHP 5.1.0 中添加) 1(周一)到 7(周日)

http://php.net/manual/en/function.date.php

有关支持的时区列表,请参阅 http://php.net/manual/en/timezones.php

【讨论】:

【参考方案12】:

日期部分的基于标准字母的表示非常棒,但它们并不那么直观。更方便的方法是识别基本的抽象和一些具体的实现。此外,通过这种方法,您可以从自动补全中受益。

由于我们在这里讨论的是日期时间,因此基本抽象是ISO8601DateTime 似乎是合理的。具体实现之一是当前日期时间,这是您向后端发出请求时需要的,因此是Now() 类。第二个对您有用的是调整到某个时区的日期时间。毫不奇怪,它被称为AdjustedAccordingToTimeZone。最后,您需要在已通过的日期时间的时区中找到一周中的某一天:为此有一个 LocalDayOfWeek 类。所以代码如下所示:

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

有关此方法的更多信息,take a look here。

【讨论】:

以上是关于如何在特定时区的php中查找星期几的主要内容,如果未能解决你的问题,请参考以下文章

在 datepicker 中选择特定日期时,如何自动填充特定的星期几?

使用 php 查找月份中的特定星期

当用户从日期选择器中选择日期时,如何在下拉列表中获取特定的星期几?

PHP,Codeigniter:如何在Web应用程序中根据用户时区/位置设置日期/时间?

php日历模块的运算逻辑求解!如何求日期对应的星期几!

如何为特定的星期几设置重复通知?