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

时间:2009-04-03 06:41:36

标签: php datetime timezone

使用php处理日期/时间时我很困惑。

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

我不想使用浏览器的一天。 我想在php中进行这个计算。

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

  1. 用户输入的时区
  2. Unix时间戳由php time()函数计算。
  3. 但我不知道如何继续...... 我如何在这个时区获得“星期几”。

12 个答案:

答案 0 :(得分:141)

$dw = date( "w", $timestamp);

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

答案 1 :(得分:113)

我的解决方案是:

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

输出为:Tuesday

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

输出为:Tue

答案 2 :(得分:20)

非常感谢你们的快速评论。

这就是我现在将要使用的内容。 在这里发布功能,以便有人可以使用它。

public function getDayOfWeek($pTimezone)
{

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

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

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

}

报告您是否发现任何更正。

答案 3 :(得分:16)

我认为这是正确答案,只需将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

答案 4 :(得分:8)

另一种快捷方式:

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

答案 5 :(得分:5)

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

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

答案 6 :(得分:3)

$myTimezone = date_default_timezone_get();
date_default_timezone_set($userTimezone);
$userDay = date('l', $userTimestamp);
date_default_timezone_set($myTimezone);

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

但是,您可能会遇到一些带有时区标识符的冒险。

答案 7 :(得分:2)

“星期几”实际上是你可以直接从php date()函数获得的,格式为“l”或“N”。看一下 the manual

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

答案 8 :(得分:2)

检查日期是星期一或星期日,在上个星期一或上周日之前

 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 :(得分:2)

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

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 :(得分:0)

日期部分的标准基于字母的表示非常好,除了它们不那么直观。更方便的方法是识别基本抽象和许多特定的实现。此外,通过这种方法,您可以受益于自动补全。

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

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

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

答案 11 :(得分:-1)

echo date('l', strtotime('today'));