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
,LocalDateTime
及ZonedDateTime
… 等類別.
- 方法的一致性: 在所有的類別中, 方法都是具有一致性, 相同名稱的方法完成的行為也是相同, 例如 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
Period
和 Duration
很像, 都是用來定義一段時間的區段. 但是比較不一樣的是 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()
LocalDateTime
及 ZonedDateTime
類別提供的方法:- 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-objectsPython - 時區
Python 本身並沒有好用的時區模組, 所以這裡會使用第三方模組 pytz