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

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

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

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

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

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

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

【问题讨论】:

    标签: php datetime timezone


    【解决方案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

                【讨论】:

                  猜你喜欢
                  • 2021-11-19
                  • 2021-06-29
                  • 2012-10-01
                  • 2015-10-10
                  • 2011-02-16
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多