乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      PHP中的日期相關(guān)函數(shù)(二)

       硬核項(xiàng)目經(jīng)理 2021-05-31

      PHP中的日期相關(guān)函數(shù)(二)

      上回文章中我們介紹了三個(gè)時(shí)間日期相關(guān)的對象,不過它們的出鏡頻率并不是特別地高。今天學(xué)習(xí)的對象雖說可能不少人使用過,但是它的出鏡頻率也是非常低的。它們其實(shí)就是我們非常常用的那些面向過程的日期函數(shù)的面向?qū)ο笫降姆庋b。但,酒香不怕巷子深,好東西還是值得我們?nèi)ド钊氲膶W(xué)習(xí)研究的,當(dāng)然更好的情況是可以在面對不同的業(yè)務(wù)場景時(shí)靈活地使用這些對象才是我們學(xué)習(xí)的根本目的。

      DateTime 對象

      沒錯(cuò),今天我們學(xué)習(xí)的就是 DateTime 對象。從名字就可以看出,它就是一個(gè)標(biāo)準(zhǔn)的日期時(shí)間類。

      $date = new DateTime('now'new DateTimeZone('Asia/Tokyo'));
      echo $date->format('Y-m-d H:i:sP'), PHP_EOL;
      // 2020-09-29 09:47:57+09:00

      $date = new DateTime();
      echo $date->format('Y-m-d H:i:sP'), PHP_EOL;
      // 2020-09-29 10:22:45+08:00

      我們可以為它指定時(shí)間,指定時(shí)區(qū)。在第一行的測試代碼中,我們指定了時(shí)間為 now ,也就是當(dāng)前時(shí)間,這里還可以傳遞字符串的時(shí)間格式給這個(gè)參數(shù)。第二個(gè)參數(shù)就是指定時(shí)區(qū),我們傳遞了日本的區(qū)域時(shí)區(qū),所以它的 P 格式化后輸入的就是 +9:00 ,也就是東九區(qū),比我們的北京時(shí)間東八區(qū)早 1 個(gè)小時(shí)。DateTime 實(shí)例化時(shí)不傳遞任何參數(shù)的話,默認(rèn)情況就是當(dāng)前的時(shí)間以及 php.ini 中指定的時(shí)區(qū)。

      還可以通過其它的方式來創(chuàng)建 DateTime 對象。

      $date = DateTime::createFromFormat('Y年m月j日 H時(shí)i分s秒''2020年09月22日 22時(shí)13分35秒');
      echo $date->format('Y-m-d H:i:sP'), PHP_EOL;
      // 2020-09-22 22:13:35+08:00

      $date = DateTime::createFromImmutable(new DateTimeImmutable("2020-09-22 11:45"));
      echo $date->format('Y-m-d H:i:sP'), PHP_EOL;
      // 2020-09-22 11:45:00+08:00

      createFromFormat() 靜態(tài)方法是按照指定的格式來生成 DateTime 時(shí)間對象。在這里我們指定的格式是我們中文常用的格式,后面緊跟著具體的日期。createFromImmutable() 則是通過 DateTimeImmutable 對象來創(chuàng)建 DateTime 對象。

      DateTime 與 DateTimeImmutable

      DateTimeImmutable 是日期表示對象,它與 DateTime 基本沒什么區(qū)別,方法、屬性都和 DateTime 是一樣的,唯一的區(qū)別就是在后面介紹的操作方法中它不會修改自身,而是返回一個(gè)新的對象。在 DateTimeImmutable 對象中也有一個(gè)靜態(tài)方法 createFromMutable() 是從 DateTime 對象創(chuàng)建一個(gè) DateTimeImmutable 對象。

      $di = new DateTimeImmutable("2020-09-22 11:45");
      var_dump($di);
      // object(DateTimeImmutable)#1 (3) {
      //     ["date"]=>
      //     string(26) "2020-09-22 11:45:00.000000"
      //     ["timezone_type"]=>
      //     int(3)
      //     ["timezone"]=>
      //     string(13) "Asia/Shanghai"
      //   }
      var_dump($di->add(new DateInterval('P3D')));
      // object(DateTimeImmutable)#4 (3) {
      //     ["date"]=>
      //     string(26) "2020-09-25 11:45:00.000000"
      //     ["timezone_type"]=>
      //     int(3)
      //     ["timezone"]=>
      //     string(13) "Asia/Shanghai"
      //   }

      $date = new DateTime("2020-09-22 11:45");
      var_dump($date);
      // object(DateTime)#4 (3) {
      //     ["date"]=>
      //     string(26) "2020-09-22 11:45:00.000000"
      //     ["timezone_type"]=>
      //     int(3)
      //     ["timezone"]=>
      //     string(13) "Asia/Shanghai"
      //   }
      var_dump($date->add(new DateInterval('P3D')));
      // object(DateTime)#4 (3) {
      //     ["date"]=>
      //     string(26) "2020-09-25 11:45:00.000000"
      //     ["timezone_type"]=>
      //     int(3)
      //     ["timezone"]=>
      //     string(13) "Asia/Shanghai"
      //   }

      從上面的測試代碼就可以看出 DateTimeImmutable 在使用 add() 方法之后返回的對象是一個(gè)新的對象,object(DateTimeImmutable)#1 (3) 變成了 object(DateTimeImmutable)#4 (3) 。而 DateTime 則是在自身進(jìn)行的修改,對象標(biāo)識符并沒有發(fā)生改變。

      DateTime 操作

      上文中 add() 方法就是增加日期的方法,它需要一個(gè) DateInterval 時(shí)間間隔對象作為參數(shù),然后就會給對應(yīng)的日期增加指定的時(shí)間間隔。

      $date->add(new DateInterval('P3D'));
      echo $date->format('Y-m-d H:i:sP'), PHP_EOL;
      // 2020-09-29 09:22:45+08:00

      這里我們就是為當(dāng)前的時(shí)間增加了3天,關(guān)于 DateInterval 對象的內(nèi)容可以查閱上篇文章中的介紹。當(dāng)然,除了增加之外,還有減少以及修改的方法。

      $date->sub(new DateInterval('P3D'));
      echo $date->format('Y-m-d H:i:sP'), PHP_EOL;
      // 2020-10-02 09:22:45+08:00

      $date->modify('+5 day');
      echo $date->format('Y-m-d H:i:sP'), PHP_EOL;
      // 2020-10-04 09:22:45+08:00

      $date->modify('-4 day -4 hours');
      echo $date->format('Y-m-d H:i:sP'), PHP_EOL;
      // 2020-09-30 05:22:45+08:00

      sub() 方法就是給一個(gè)時(shí)間對象減少指定的時(shí)間間隔,而 modify() 方法就是根據(jù)參數(shù)來直接修改日期,比如我們這里測試了增加5天和減少4天4小時(shí)的操作。


      $origin = new DateTime('now');
      $target = new DateTime('2020-09-11');
      $interval = $origin->diff($target);
      echo $interval->format('%a days'), PHP_EOL;
      echo $interval->format('%R%a days'), PHP_EOL;
      // 18 days
      // -18 days

      diff() 方法就是返回兩個(gè)日期之間的差值,相信這個(gè)方法不少人使用過它的面向過程的函數(shù),也就是 date_diff() 函數(shù),相對于其它方法來說,它的出鏡率就非常高了。%R 返回的是符號位,如果是負(fù)號就是比指定的日期少了多少時(shí)間間隔。

      設(shè)置日期時(shí)間

      除了操作日期時(shí)間之外,我們在實(shí)例化 DateTime 對象之后,也可以為它重新指定日期。

      $date = new DateTime();
      $date->setDate(2020925);
      echo $date->format('Y-m-d H:i:sP'), PHP_EOL;
      // 2020-09-25 09:22:45+08:00

      $date->setISODate(2020925);
      echo $date->format('Y-m-d H:i:sP'), PHP_EOL;
      // 2020-03-19 09:22:45+08:00

      $date->setTime(1455);
      echo $date->format('Y-m-d H:i:sP'), PHP_EOL;
      // 2020-10-03 14:55:00+08:00

      $date->setDate(2020933);
      echo $date->format('Y-m-d H:i:sP'), PHP_EOL;
      // 2020-10-03 09:22:45+08:00

      $date->setTime(1463);
      echo $date->format('Y-m-d H:i:sP'), PHP_EOL;
      // 2020-10-03 15:03:00+08:00

      setDate() 方法就是指定日期,setTime() 方法是指定時(shí)間,它們是分開的兩個(gè)方法哦。setISODate() 設(shè)置的是 ISO 標(biāo)準(zhǔn)時(shí)間,這又是另一套日期時(shí)間規(guī)范了,感興趣的朋友可以自行查閱下相關(guān)的知識,這里就不多做贅述了。如果我們設(shè)置的日期不是一個(gè)正常的日期格式,比如我們在測試代碼中設(shè)置了 9月33號 這個(gè)日期,那么它會自動向后延,輸出的結(jié)果就是 10月3號 這個(gè)日期,包括 setTime() 方法也是可以這樣順延的。其實(shí)所有日期相關(guān)的對象、方法、函數(shù)都有這樣的能力。

      另外,我們還可以通過時(shí)間戳進(jìn)行 DateTime 對象的日期時(shí)間設(shè)置。同理,時(shí)區(qū)也是可以單獨(dú)設(shè)置的。

      $date->setTimestamp(time()-84400);
      echo $date->format('U = Y-m-d H:i:s'), PHP_EOL;
      // 1601258165 = 2020-09-28 09:56:05

      $date->setTimezone(new DateTimeZone('Asia/Tokyo'));
      echo $date->format('U = Y-m-d H:i:s'), PHP_EOL;
      // 1601258165 = 2020-09-28 10:56:05

      獲取屬性及錯(cuò)誤信息

      既然 DateTime 對象有這么多設(shè)置的東西,那么相對應(yīng)的它也有一些屬性是可以讓我們獲取的。

      echo $date->getOffset(), PHP_EOL;
      // 32400

      echo $date->getTimestamp(), PHP_EOL;
      // 1601258070

      var_dump($date->getTimezone());
      // object(DateTimeZone)#6 (2) {
      //     ["timezone_type"]=>
      //     int(3)
      //     ["timezone"]=>
      //     string(10) "Asia/Tokyo"
      //   }

      getOffset() 方法就是獲取得我們與標(biāo)準(zhǔn)時(shí)區(qū)的差值,也就是對應(yīng)的北京相差 8 個(gè)小時(shí)的信息,這個(gè)在之前的文章中與 DateTimeZone 對象的同名方法的作用是類似的。getTimestamp() 和 getTimezone() 方法相信也不用多解釋了,一個(gè)是返回當(dāng)前 DateTime 對象對應(yīng)的時(shí)間戳,一個(gè)是返回一個(gè)時(shí)區(qū)對象。

      最后,我們再來看看 DateTime() 對象的錯(cuò)誤處理。DateTime 對象其實(shí)也是可以用過程化的方式來寫的,所以它提供了一個(gè) getLastErrors() 方法,不過我們在使用面向?qū)ο蟮姆绞綍r(shí),DateTime 對象會以異常的形式進(jìn)行拋出。

      $date = date_create('asdfasdf');
      print_r(DateTime::getLastErrors());
      // Array
      // (
      //     [warning_count] => 1
      //     [warnings] => Array
      //         (
      //             [6] => Double timezone specification
      //         )

      //     [error_count] => 1
      //     [errors] => Array
      //         (
      //             [0] => The timezone could not be found in the database
      //         )

      // )

      try {
          $date = new DateTime('asdfasdf');
      catch (Exception $e) {
          echo $e->getMessage(), PHP_EOL;
      }
      // DateTime::__construct(): Failed to parse time string (asdfasdf) at position 0 (a): The timezone could not be found in the database

      第一段代碼就是以面向過程的函數(shù)方式來創(chuàng)建的一個(gè) DateTime 對象,它不會拋出異常,這樣我們就可以通過 getLastErrors() 方法獲得錯(cuò)誤信息。但是現(xiàn)在還是更推薦以面向?qū)ο蟮姆绞絹聿僮?DateTime ,所以我們應(yīng)該盡量使用第二段代碼的方式來處理錯(cuò)誤信息。

      總結(jié)

      怎么樣,DateTime 對象的是不是很有意思?思考一下,我們?nèi)粘5暮芏嗳掌诓僮魇遣皇且部梢酝ㄟ^它來實(shí)現(xiàn)了。關(guān)于 DateTimeImmutable 的內(nèi)容就不會再單獨(dú)講解了,大家可以自己查閱一下相關(guān)的資料,因?yàn)閮?nèi)容其實(shí)都是和 DateTime 一樣的,唯一的區(qū)別在上文中也已經(jīng)說明了。

      測試代碼:

      https://github.com/zhangyue0503/dev-blog/blob/master/php/202009/source/13.PHP中的日期相關(guān)函數(shù)(二).php

      參考文檔:

      https://www./manual/zh/class.datetime.php

      https://www./manual/zh/class.datetimeimmutable.php

        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多