2021-05-22

【PHP】以個體導向(物件導向) 方式進行日期的運算

 

  1.  
  2. // 設定時區
  3. date_default_timezone_set('Asia/Taipei');
  4.  
  5.  
  6. // 建立 日期時間個體(物件)
  7. $date = new DateTime(); // 未帶參數時, 就是現在
  8.  
  9. $date = new DateTime('2000-01-01'); // 帶參數, 就是指定日期
  10. // 沒有時間參數, 就是 00:00:00
  11. // 以下同此例
  12. // 老人家較關心日期,所以就不管時間了! XD
  13.  
  14. // 日期往後(日期時間的加法)
  15. echo '方法一:加 10 月';
  16. $date->add(new DateInterval('P10M')); // P 表 period, M 表 "月"
  17. echo $date->format('Y-m-d') . "\n"; // 格式化顯示 西元 年-月-日, 相當於 date() 函式
  18.  
  19.  
  20. echo '方法二:加 2 天';
  21. $date->modify('+2 day');
  22. echo $date->format('Y-m-d') . "\n";
  23.  
  24.  
  25. // 日期往前(日期時間的減法)
  26. echo '方法一:減 8 月 10 天';
  27. $date->sub(new DateInterval('P8M10D'));
  28. echo $date->format('Y-m-d') . "\n";
  29.  
  30. echo '方法二:減 2 天';
  31. $date->modify('-2 day');
  32. echo $date->format('Y-m-d') . "\n";
  33.  
  34.  
  35. echo '當月 1 日';
  36. $date->modify('first day of');
  37. echo $date->format('Y-m-d') . "\n";
  38.  
  39.  
  40. echo '當月月底';
  41. $date->modify('last day of');
  42. echo $date->format('Y-m-d') . "\n";
  43.  
  44.  
  45. echo '前一天';
  46. $date->modify('yesterday');
  47. echo $date->format('Y-m-d') . "\n";
  48.  
  49.  
  50. echo '後一天';
  51. $date->modify('tomorrow');
  52. echo $date->format('Y-m-d') . "\n";
  53.  
  54.  
  55. echo '查 2000-01-01 是星期幾';
  56. $dayOfWeek = $date->format('w');
  57. echo "dayOfWeek = $dayOfWeek\n"; // 6, 星期日 = 0, 星期一 = 1, ...
  58.  
  59.  
  60. echo "當週的星期日";
  61. $sunday = $date->modify("-$dayOfWeek day");
  62. echo "sunday = ".$sunday->format('Y-m-d')."\n";
  63.  
  64.  
  65. echo '當月第一個週一';
  66. $date->modify('first mon of'); // 大小寫無差, 完整寫法 monday 也行
  67. echo $date->format('Y-m-d') . "\n";
  68.  
  69.  
  70. echo '當月最後一個週六';
  71. $date->modify('last sat of');
  72. echo $date->format('Y-m-d') . "\n";
  73.  
  74.  
  75. echo '移至離當日最近的下個週四';
  76. $date->modify('thursday');
  77. echo $date->format('Y-m-d') . "\n";
  78.  
  79.  
  80. echo '移至下個週五';
  81. $date->modify('fri'); // 因為隔天就是週五, 所以只移了 1 天
  82. echo $date->format('Y-m-d') . "\n";
  83.  
  84.  
  85. echo '移至下個週三';
  86. $date->modify('wed');
  87. echo $date->format('Y-m-d') . "\n";
  88.  
  89.  
  90. echo '移至下個月';
  91. $date->modify('next month'); // 似乎無法搭配 day, ex: next day
  92. // 也不能搭數字, ex: next 2 month
  93. echo $date->format('Y-m-d') . "\n";
  94.  
  95. // 前一年的年初(第一天)
  96. $date->modify('first day of january last year');
  97.  
  98. // 前一年的年底(最後一天)
  99. $date->modify('last day of december last year');
  100.  
  101.  
  102. // 日期的複製
  103. // 不能直接宣告一個新的變數, 這樣有點類似 "指標"
  104. $date2 = $date // 這樣其實是將 $date2 指向 $date
  105. // 要將 $date2 看做是 $date 的別名
  106. // 當變更了 $date2 的值, 其實是變更 $date
  107.  
  108. // 應該要
  109. $date2 = new DateTime($date->format('Y-m-d'));
  110.  

 

 

關於上述例子中,簡單英文日期時間的參數格式,可以參考 Relative Formats

 

沒有留言:

張貼留言