Jave, Php 及 Python 的日期時間處理
2017-4-27
| 2024-10-31
0  |  Read Time 0 min
type
status
date
slug
summary
tags
category
icon
password
日期時間的處理是每一個程式設計師都會遇到. 雖然看起來很簡單, 但是在實際使用上, 又會因為各程式語言的實作不同而有不同的用法.這裡簡單地記錄我曾經用過的程式語言對於日期時間的處理.

Java 1.7以前

Java 1.7以前-相關的類別

  • java.util.Date
  • java.util.Calendar
  • java.util.TimeZone
  • java.text.SimpleDateFormat

Java 1.7以前-日期時間的生成

Java1.7以前-日期字串的轉換

我們可以使用 SimpleDateFormat 類別來轉換字串及日期.
以下是比較常用的格式字符,如果要看完整的說明可以看 Java doc 的 SimpleDateFormat 類別

Java 1.7以前-日期時間的運算

Calendar 類別有提供簡易的方法可以加減日期

Java 1.7以前-時區

在 Java 1.7 以前, 我們可以有以下二種方式來取得 TimeZone 物件:
時區的轉換
使用 TimeZone.getAvailableIDs() 可以取得所有的時區列表.

Java 1.8之後

Java8 新增加的日期/時間的類別是基於 (JSR-310)[https://jcp.org/en/jsr/detail?id=310] 的實作. 這些實作都是包含在 java.time這個 package 之下. 主要有以下的優點:
  • 物件的不變性: 所有的物件都是 Immutable Object, 在物件被生成後就不能改變其值, 也因此這些物件是線程安全(thread-safe)
  • 類別的明確性: 依照不同的使用情況分成 LocalDate, LocalTime, LocalDateTimeZonedDateTime … 等類別.
  • 方法的一致性: 在所有的類別中, 方法都是具有一致性, 相同名稱的方法完成的行為也是相同, 例如 now() 方法在所有的類別中, 都是産生一個當前的物件.
  • 可擴展性: 除了能支援國際通用的ISO 8601日期與時間的表示方式外,還支援一些non-ISO的曆法.

Java 1.8之後-相關的類別

  • java.time.Instant
  • java.time.Duration
  • java.time.LocalDate
  • java.time.LocalDateTime
  • java.time.LocalTime
  • java.time.ZonedDateTime
  • java.time.format.DateTimeFormatter

Method 的前置詞

of : 靜態的工廠方法, 指定日期時間,來産生物件. parse : 靜態的工廠方法, 用來解析成日期時間物件. get : 取得某些值. is : 檢查某些條件是否為 True. with : 産生此物件的複本並將此物件某些值替換. plus : 産生此物件的複本並加些數量到某些欄位. minus : 産生此物件的複本並從某些欄位減些數量. to : 轉換成另一個類別. at : 將二個物件組合起來.

Java 1.8之後-日期時間的生成

Duration

Duration 類別用來定義一段時間的區段, 比較合適的使用場景是用來計算以機器為主的時間, 也就是你可以用 Duration 以奈秒, 秒, 分, 時 … 等時間單位來計算.
舉例來說, Duration可以用來測量一個 API 的執行時間或是一個服務的運行時間,

Period

PeriodDuration 很像, 都是用來定義一段時間的區段. 但是比較不一樣的是 Period 的最小時間單位為天(days). 比較合適用在需要曆法支援的場景, 因為一年或是一個月的時間區段不是固定的.
舉例來說, Period可以用來計算, 從某個日期到今天總共經過多少年, 多少月, 多少天

Java 1.8之後-日期字串的轉換

Java 1.8之後-日期時間的運算

基本的運算

日期時間類別本身就有提供運算的方法
Instant 類別提供的方法:
  • plusSeconds()
  • plusMillis()
  • plusNanos()
  • minusSeconds()
  • minusMillis()
  • minusNanos()
LocalDate 類別提供的方法:
  • plusDays()
  • plusWeeks()
  • plusMonths()
  • plusYears()
  • minusDays()
  • minusWeeks()
  • minusMonths()
  • minusYears()
LocalTime 類別提供的方法:
  • plusHours()
  • plusMinutes()
  • plusSeconds()
  • plusNanos()
  • minusHours()
  • minusMinutes()
  • minusSeconds()
  • minusNanos()
LocalDateTimeZonedDateTime 類別提供的方法:
  • plusYears()
  • plusMonths()
  • plusDays()
  • plusHours()
  • plusMinutes()
  • plusSeconds()
  • plusNanos()
  • minusYears()
  • minusMonths()
  • minusDays()
  • minusHours()
  • minusMinutes()
  • minusSeconds()
  • minusNanos()

TemporalAdjusters

TemporalAdjusters 提供一些靜態方法可以讓我們直接從一個時間點轉移到其它的時間點. 比如:我們想要取得這個月的最後一天:

Java 1.8之後-時區

PHP

PHP - 相關的類別

  • DateTime
  • DateTimeZone

PHP - 日期時間的生成

PHP - 日期字串的轉換

以下是有關時間的格式字符,只列出比較常用的部分, 其它詳細的說明, 請參照 date
在産生日期時間物件時, 可以使用以下格式的字串來産生特定的日期
在 PHP 則只要把符合上述字串的日期時間格式帶入

PHP - 日期時間的運算

使用 modify 方法可以進行日期的加減

PHP - 時區

PHP 有提供 DateTimeZone 這個時區類別, 我們可以直接來使用

Python

Python 處理日期時間的方式有許多種. 但在這裡是以 DateTime 為核心.

Python - 相關的類別

  • datetime
  • datetime.time
  • datetime.timedelta
可以參照 datetime.

Python - 日期時間的生成

Python - 日期字串的轉換

Python 有提供 strftime()strptime() 這二個方法來轉換日期和字串.
以下是常用的格式字符, 其它的字符可以參照strftime and strptime behavior

Python - 日期時間的運算

timedelta 物件可以讓我們對日期時間進行操作, 可參照 timedelta-objects

Python - 時區

Python 本身並沒有好用的時區模組, 所以這裡會使用第三方模組 pytz
  • php
  • java
  • python
  • 將圖片預覽上傳及儲存在資料庫中Ansible 筆記
    Loading...
    目錄