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


95

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

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

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

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

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

但我不知道该如何进行...在该时区我将如何获得“一周中的某天”。

Answers:


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

您可以在此处看到$ dw为0(星期日)到6(星期六)的情况:http : //www.php.net/manual/en/function.date.php


65
从php 5.1.0开始,您可以使用从星期一开始date("N", $timestamp)获取1..7值。在较旧的版本中,您可以使用技巧从星期一开始(date("w", $timestamp) + 6) % 7获取0..6值。
oluckyman

22
我很困惑 这怎么有这么多票?问题是如何获取特定时区中的星期几,而不是Web服务器的时区,而不是GMT。这回答了问题的第一部分,但完全忽略了问题的第二部分。
tfinniga

6
@tfinniga,我想原因是,很多人来到这个问题,搜索如何获得星期(像我一样)时,再投上一票,因为它回答了他们的问题:)
DAV

请注意,只有在UNIX时代(1970-2038 / 0x0-0x7FFFFFFF以秒为单位)内移动时,date()和mktime()才起作用。使用新的PHP“日期和时间相关的扩展”
eosphere,2014年

1
@dav哇,您可能是对的,但这似乎是一个非常糟糕的原因。我觉得我开始对一般的php开发人员发表强烈的意见。
tfinniga 2015年

117

我的解决方案是这样的:

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

输出为: Tuesday

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

输出为: Tue


这很漂亮。我使用了date('D',strtotime($ DATE))。我的$ DATE变量已经采用了正确的格式。我用它来识别我制作的报告数据库中的DOW。在多个日期之间进行搜索时,最好使用一点额外的DOW缩写。
user208145


20

非常感谢您的快速评论。

这就是我现在将要使用的。在此处发布函数,以便有人可以使用它。

public function getDayOfWeek($pTimezone)
{

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

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

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

}

报告是否发现任何更正。


9

另一种快速方法:

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

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

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

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

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


2

实际上,“星期几”实际上是您可以直接从php date()函数直接获取的格式分别为“ l”或“ N”的东西。看看 手册

编辑:抱歉,我没有正确阅读Kalium的帖子,他已经解释了。我的错。


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

尽管这可能有用途,但不能回答问题。
outis 2014年

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

尽管这可能有用途,但不能回答问题。
2014年

0

基于日期部分的基于字母的标准表示非常出色,但事实并非如此直观。更方便的方法是识别基本抽象和许多特定的实现。此外,通过这种方法,您可以受益于自动补全。

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

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

有关此方法的更多信息,请在此处查看


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

尽管此代码段可以解决问题,但提供说明确实有助于提高您的帖子质量。请记住,您将来会为读者回答这个问题,而这些人可能不知道您提出代码建议的原因。
andreas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.