• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • localtime()

    (PHP 4, PHP 5, PHP 7)

    取得本地时间

    说明

    localtime([int $timestamp= time()[,bool $is_associative= false]]): array

    localtime()函数返回一个数组,其结构和 C 函数调用返回的完全一样。

    参数

    $timestamp

    可选的$timestamp参数是一个integer的 Unix时间戳,如未指定,参数值默认为当前本地时间。也就是说,其值默认为time()的返回值。

    $is_associative

    如果设为FALSE或未提供则返回的是普通的数字索引数组。如果该参数设为TRUElocaltime()函数返回包含有所有从 C 的 localtime 函数调用所返回的不同单元的关联数组。关联数组中不同的键名为:

    • "tm_sec"-秒数,059
    • "tm_min"-分钟数,059
    • "tm_hour"-小时,023
    • "tm_mday"-月份中的第几日,131
    • "tm_mon"-年份中的第几个月,0(Jan)到11(Dec)
    • "tm_year"-年份,从 1900 开始
    • "tm_wday"-星期中的第几天,0(Sun)到6(Sat)
    • "tm_yday"-一年中的第几天,0365
    • "tm_isdst"-夏令时当前是否生效?如果是生效的是正数,0代表未生效,负数代表未知。

    错误/异常

    在每次调用日期/时间函数时,如果时区无效则会引发E_NOTICE错误,如果使用系统设定值或TZ环境变量,则会引发E_STRICTE_WARNING消息。参见date_default_timezone_set()。

    更新日志

    版本说明
    5.1.0

    现在发布E_STRICTE_NOTICE时区错误。

    范例

    Example #1localtime()例子

    <?php
    $localtime = localtime();
    $localtime_assoc = localtime(time(), true);
    print_r($localtime);
    print_r($localtime_assoc);
    ?>
    

    以上例程的输出类似于:

    Array
    (
        [0] => 24
        [1] => 3
        [2] => 19
        [3] => 3
        [4] => 3
        [5] => 105
        [6] => 0
        [7] => 92
        [8] => 1
    )
    Array
    (
        [tm_sec] => 24
        [tm_min] => 3
        [tm_hour] => 19
        [tm_mday] => 3
        [tm_mon] => 3
        [tm_year] => 105
        [tm_wday] => 0
        [tm_yday] => 92
        [tm_isdst] => 1
    )
    

    参见

    Date select box for the current week, or whatever week you give for an offset (in seconds), returns the string you can echo with the select box named $name:
    <?php
    function week_date_selectbox( $time_offset, $name )
      {
      if( isset( $time_offset ) )
        $t = time() + $time_offset;
      else
        $t = time();
      $wday = array("Sun ","Mon ","Tue ","Wed ","Thu ","Fri ","Sat ");
      $mon = array("Jan ","Feb ","Mar ","Apr ","May ","Jun ","Jul ","Aug ","Sep ","Oct ","Nov ","Dec ");
      $mybox = "<select name=\"$name\">\n";
      for($ii = 0; $ii > -6; $ii--)
        {
        $tarr = localtime( $t + $ii * 86400, 1 );
        if( $tarr["tm_wday"] == 0 )
          {
          // found Sunday, now make the week's strings
          for($jj = 0; $jj < 7; $jj++)
            {
            $tarr = localtime( $t + ($jj + $ii) * 86400, 1 );
            $mybox .= sprintf( " <option value=\"%04d-%02d-%02d\">%s%s%d %d</option>\n",
                ((int)$tarr["tm_year"] + 1900),
                $tarr["tm_mon"],
                ((int)$tarr["tm_mday"] + 1),
                $wday[$tarr["tm_wday"]],
                $mon[$tarr["tm_mon"]],
                (int)$tarr["tm_mday"],
                ((int)$tarr["tm_year"] + 1900) );
            }
          break;
          }
        }
      $mybox .= "</select>\n";
      return $mybox;
      }
    ?>
    
    The corresponding function call to get the GMT time is not specified here. Only local time is reported, according to the current TZ environment setting.
    One could try to use putenv() to set another timezone temporarily, however when running PHP in safe mode, putenv() is disabled and cannot be used in scripts.
    However it's possible to simulate gmttime() by using localtime() and by transforming the results in the returned array.
    The biggest problem with this function is that it is using an OS-dependent and localtime() function which is also depending on the standard C library implementation (some of them, do not support accurate locales). The second problem is that localtime() does not return an index specifying the local timezone offset, so transforming this date to UTC will become very ugly. Some systems support the gmtime() C function call, some don't. To get the timezone, some C libraries provide a global _timezone variable, some provide it as a macro that use a function call, some do not provide any variable, and one must deduce it by interpreting the TZ environment. This is too much ugly for PHP.
    PHP should be extended by adding support to gmttime() with the same parameters, but the returned array should include additional indices to store the timezone offsets in seconds and names for both standard time and DST, for example:
     [tz_offset_std] = 3600,
     [tz_offset_dst]= 7200,
     [tz_name_std] = 'CET', (GMT+01:00)
     [tz_name_dst] = 'CEDT'. (GMT+02:00)
    Or for the international, locale-independant, Zulu time (also known as UCT or simply UT), returned by gmtime():
     [tz_offset] = 0,
     [tz_offset_dst]= 0,
     [tz_name] = 'Z',
     [tz_name_dst] = 'Z'.
    But it's much easier to use PHP's date() and gmdate() to make such transformations.
    Beware of DST rules! In the southern hemisphere, standard time still occurs during winter, but the southern Winter is in June, not in December ! Use the tm_isdst indicator to know which timezone to display or interpret !
    its something strange on locatime function, if i test this function with zero parameter
    print_r(localtime(0));
    it returns this 
    Array
    (
      [0] => 0
      [1] => 0
      [2] => 1  <-----
      [3] => 1
      [4] => 0
      [5] => 70
      [6] => 4
      [7] => 0
      [8] => 0
    )
    that is not the unix epoc but one hour after, it should be
    Array
    (
      [0] => 0
      [1] => 0
      [2] => 0  <-----
      [3] => 1
      [4] => 0
      [5] => 70
      [6] => 4
      [7] => 0
      [8] => 0
    )
    You can implement gmtime quote simply.
    <?php
    function GetTZOffset() { 
     $Offset = date("O", 0);
      
     $Parity = $Offset < 0 ? -1 : 1;
     $Offset = $Parity * $Offset;
     $Offset = ($Offset - ($Offset % 100))/100*60 + $Offset % 100;
     return $Parity * $Offset;
    }
    $TZOffset = GetTZOffset();
    $t_time = time() $TZOffset*60; #Counter adjust for localtime()
    $t_arr = localtime($t_time);
    ?>
    
    Here is another version of gmtime(). This one doesn't involve messing around with timezones at all. Note that PHP4 users should check out the array_combine page for replacements for that function.
    <?php
    function gmtime($ts=null, $is_associative=false){
      if(is_null($ts)) $ts=time();
      $t=array_map('intval',explode(',',gmdate('s,i,H,d,m,Y,w,z,I',$ts)));
      $t[4]--;
      $t[5]-=1900;
      if(!$is_associative) return $t;
      return array_combine(array('tm_sec','tm_min','tm_hour','tm_mday','tm_mon',
                     'tm_year','tm_wday','tm_yday','tm_isdst'),
                $t);
    }
    ?>
    
    I strongly suggest to do all of your developments using GMT/UTC dates & times.
    I provide here a version of a 'gmttime' function. Save it in a separate file and include it when needed.
    Please post a correction here if you find it not working for your timezone (with or without daylight saving time.). 
    Thanks & Enjoy.
    -----------------------------------------------
    <?php
    //
    // File: gmttime.php
    //
    // Description:
    //  Implements the gmttime function if missing from the PHP distribution
    //
    // Verifies that the function isn't already implemented
    if (function_exists(gmttime))
      return;
    //
    // Function: gmttime
    //
    // Description:
    //  Returns an array indexed as by the localtime() function:
    //  - 0 or tm_sec: Seconds
    //  - 1 or tm_min: Minutes
    //  - 2 or tm_hour: Hour
    //  - 3 or tm_mday: Day of the month
    //  - 4 or tm_mon: Month of the year
    //  - 5 or tm_year: Years since 1900
    //  - 6 or tm_wday: Day of the week
    //  - 7 or tm_yday: Day of the year
    //  - 8 or tm_isdst: Is daylight saving time in effect
    //  - tm_fyear: Full year (only available with associative array)
    //
    // Arguments:
    //  - Timestamp
    //  - Boolean (for associative indexing: 0 = off, 1 = on)
    //
    // Returns:
    //  An array on success,
    //  false on failure.
    //
    function gmttime($dTimestamp = '', $bAssoc = 0) {
      // Evaluate how much difference there is between local and GTM/UTC
      // Don't forget to correct for daylight saving time...
      $aNow = localtime();
      $iDelta = gmmktime(1, 1, 1, 1, 1, 1970, $aNow[8]) - mktime(1, 1, 1, 1, 1, 1970, $aNow[8]);
      if (!$bAssoc) {
        if ($dTimestamp == '') {
          return localtime(time() - $iDelta, 0);
        } else {
          return localtime($dTimestamp - $iDelta, 0);
        }
      } else {
        // For associative array, add full year index
        if ($dTimestamp == '') {
          $aGMTTime = localtime(time() - $iDelta, 1);
        } else {
          $aGMTTime = localtime($dTimestamp - $iDelta, 1);
        }
        $aGMTTime['tm_fyear'] = $aGMTTime['tm_year'] + 1900;
        return $aGMTTime;
      } // End [IF] return associative array?
    } // End [FUNCTION] gmttime
    ?>
    
    Sometimes, there's not a server-based/PHP method for getting local time. You have to get it from the client via Javascript. Google "bitbucket timezone detect" and use it to set a "local_timezone" cookie that you can read from PHP and set via date_default_timezone_set()
    You must keep in mind the difference between your server's time and your client's time! 
    I ran into this one when I wrote a calendar-based reminder system with SMS messaging - guys back east were always getting their messages late. (!?!) 
    I wrote two functions as wrappers for date handling, ServerTime() and ClientTime() that take client time (integer timestamp) and translate to server time and vice-versa based on config file settings. 
    Needless to say, you CANNOT FORGET THIS.
    to set up berlin time it could look like this:
    <?php
      print "<HTML><body><pre>";
      
      setlocale( "LC_ALL", "de_DE" );
      
      putenv( "PHP_TZ=Europe/Berlin" );
      
      $now = time();
      
      print_r( localtime(time(),true) );
      print_r( getdate() );
      
      print date("H:i:s");
      print date("T");
      
    ?>
    

    上篇:idate()

    下篇:microtime()