strptime
位於 base
包(package)。 說明
在字符表示和表示日曆日期和時間的 "POSIXlt"
和 "POSIXct"
類的對象之間進行轉換的函數。
用法
## S3 method for class 'POSIXct'
format(x, format = "", tz = "", usetz = FALSE, ...)
## S3 method for class 'POSIXlt'
format(x, format = "", usetz = FALSE,
digits = getOption("digits.secs"), ...)
## S3 method for class 'POSIXt'
as.character(x, digits = if(inherits(x, "POSIXlt")) 14L else 6L,
OutDec = ".", ...)
strftime(x, format = "", tz = "", usetz = FALSE, ...)
strptime(x, format, tz = "")
參數
x |
要轉換的對象: |
tz |
指定用於轉換的時區的字符串。係統特定(請參閱 |
format |
一個字符串。如果任何元素具有非午夜的時間分量,則 |
... |
從其他方法傳遞或向其他方法傳遞的進一步參數。 |
usetz |
合乎邏輯的。時區縮寫是否應該附加到輸出中?這是在打印時使用的,比使用 |
digits |
需要時確定秒數的 |
OutDec |
指定要使用的小數點的 1 個字符的字符串;默認值不是故意的 |
細節
format
和 as.character
方法以及 strftime
將對象從類 "POSIXlt"
和 "POSIXct"
轉換為 character
向量。
strptime
將字符向量轉換為類 "POSIXlt"
:其輸入 x
首先由 as.character
轉換。每個輸入字符串都會根據指定的格式進行必要的處理:任何尾隨字符都會被忽略。
strftime
是一個包裝器format.POSIXlt
,並且它和format.POSIXct
首先轉換為類"POSIXlt"
通過調用as.POSIXlt
(所以他們也為類工作"Date"
)。請注意,隻有該轉換取決於時區。自從R版本4.2.0,as.POSIXlt()
轉換現在處理非有限數字-Inf
,Inf
,NA
和NaN
不同的是(以前所有的都被視為NA
)。還有format()
方法用於POSIXlt
現在將這些不同的非有限時間和日期視為類似於類型double
.
通常的向量回收規則適用於 x
和 format
,因此答案將是這些向量中較長者的長度。
在適當且可用的情況下使用 Locale-specific 與字符串之間的轉換。這會影響日期和月份的名稱、AM/PM 指示器(如果使用)以及輸出格式中的分隔符,例如%x
和%X
,通過的設置LC_TIME
語言環境類別。說明的“當前區域設置”可能意味著在開始時使用的區域設置R會話或首次使用這些函數時。 (對於輸入,locale-specific 轉換可以通過調用來更改Sys.setlocale
有類別LC_TIME
(或者LC_ALL
)。對於輸出,發生的情況取決於操作係統,但通常有效。)
格式的詳細信息是特定於平台的,但以下內容可能會廣泛使用:大多數是由 POSIX 標準定義的。轉換規範由 %
引入,通常後跟一個字母或 O
或 E
後跟一個字母。格式字符串中不屬於轉換規範的任何字符均按字麵解釋(並且 %%
給出 %
)。廣泛實施的轉換規範包括
%a
-
該平台當前區域設置中工作日的縮寫名稱。 (還匹配輸入的全名:在某些語言環境中沒有名稱縮寫。)
%A
-
當前區域設置中的完整工作日名稱。 (也匹配輸入上的縮寫名稱。)
%b
-
該平台當前區域設置中月份名稱的縮寫。 (還匹配輸入的全名:在某些語言環境中沒有名稱縮寫。)
%B
-
當前區域設置中的完整月份名稱。 (也匹配輸入上的縮寫名稱。)
%c
-
日期和時間。輸出為Locale-specific,輸入為
"%a %b %e %H:%M:%S %Y"
。 %C
-
世紀(00-99):年份的整數部分除以100。
%d
-
十進製數形式的月份日期 (01-31)。
%D
-
日期格式,例如
%m/%d/%y
:C99 標準表示它應該是這種確切的格式(但並非所有操作係統都遵守)。 %e
-
十進製數 (1-31) 表示的月份中的日期,前導空格表示 single-digit 數字。
%F
-
相當於 %Y-%m-%d(ISO 8601 日期格式)。
%g
-
基於周的年份的最後兩位數字(請參閱
%V
)。 (已接受但在輸入時被忽略。) %G
-
以周為單位的年份(請參閱
%V
)為十進製數。 (已接受但在輸入時被忽略。) %h
-
等效於
%b
。 %H
-
十進製數形式的小時 (00-23)。作為特殊的異常字符串,例如‘24:00:00’ 被接受作為輸入,因為 ISO 8601 允許這些。
%I
-
十進製數形式的小時 (01-12)。
%j
-
十進製數形式的一年中的日期 (001-366): 對於輸入,366 僅在閏年有效。
%m
-
十進製數形式的月份 (01-12)。
%M
-
分鍾為十進製數 (00-59)。
%n
-
輸出換行,輸入任意空格。
%p
-
區域設置中的 AM/PM 指示器。與
%I
結合使用,而不是與%H
結合使用。某些語言環境中的空字符串(例如,在某些操作係統、包括俄羅斯在內的非英語歐洲語言環境中)。如果用於此類區域設置中的輸入,則行為未定義。某些平台接受
%P
進行輸出,它使用小寫版本(%p
也可能使用小寫):其他平台將輸出P
。 %r
-
對於輸出,12 小時時鍾時間(使用區域設置的 AM 或 PM):僅在某些區域設置中定義,並且在未定義 AM/PM 指示符的區域設置中的某些操作係統上會產生誤導。對於輸入,相當於
%I:%M:%S %p
。 %R
-
等效於
%H:%M
。 %S
-
第二個為整數 (00-61),最多允許兩個 leap-seconds(但 POSIX-compliant 實現將忽略閏秒)。
%t
-
輸出上使用製表符,輸入上使用任意空格。
%T
-
等效於
%H:%M:%S
。 %u
-
十進製數形式的工作日(1-7,星期一為 1)。
%U
-
一年中的第幾周,以十進製數 (00-53) 表示,使用星期日作為一周的第一天(通常將一年中的第一個星期日作為第一周的第一天)。美國大會。
%V
-
一年中的第幾周,采用 ISO 8601 中定義的十進製數 (01-53)。如果包含 1 月 1 日的周(從星期一開始)在新的一年中有四天或更多天,則將其視為第 1 周。否則,將其視為第 1 周。上一年的最後一周,下一周是第一周。(接受但忽略輸入。)
%w
-
工作日為十進製數(0-6,星期日為 0)。
%W
-
一年中的第幾周,以十進製數 (00-53) 表示,使用星期一作為一周的第一天(通常將一年中的第一個星期一作為第一周的第一天)。英國大會。
%x
-
日期。輸出為Locale-specific,輸入為
"%y/%m/%d"
。 %X
-
時間。輸出為Locale-specific,輸入為
"%H:%M:%S"
。 %y
-
無世紀的年份 (00-99)。輸入時,值 00 到 68 以 20 為前綴,69 到 99 以 19 為前綴 - 這是 2018 POSIX 標準指定的行為,但它也表示“預計在未來版本中,默認世紀從 2 推斷” -數字年份將會改變'。
%Y
-
年與世紀。請注意,雖然原始公曆中沒有零,但 ISO 8601:2004 將其定義為有效(解釋為 1BC):請參閱 https://en.wikipedia.org/wiki/0_(year) 。然而,該標準還規定,其曆法中1582年之前的年份隻能在相關各方同意的情況下使用。
對於輸入,僅接受年份
0:9999
。 %z
-
與 UTC 的小時和分鍾的有符號偏移量,所以
-0800
比 UTC 晚 8 小時。 (標準僅適用於輸出。適用於輸入R目前在所有平台上都支持它 - 值來自-1400
到+1400
被接受。) %Z
-
(僅輸出。)時區縮寫為字符串(如果不可用則為空)。當時區縮寫多年來發生變化時,這可能不可靠。
顯示前導零的地方將在輸出中使用,但在輸入中是可選的。名稱在輸入時匹配 case-insensitively:輸出時名稱是否大寫取決於平台和區域設置。請注意,縮寫名稱是特定於平台的(盡管標準在‘C' 語言環境 它們必須是大寫英文名稱的前三個字母:此約定廣泛用於 English-language 語言環境,但例如法語月份縮寫在 Linux、macOS、Solaris 和 Windows 中的任何兩個上都不相同)。如果您想使用縮寫,那麽了解縮寫至關重要%a
,%b
或者%h
作為輸入格式的一部分:請參閱示例以了解如何檢查。
當 %z
或 %Z
用於具有指定時區的對象的輸出時,係統會嘗試使用該時區的值 — 但不保證成功。
%n
和 %t
的 ‘whitespace’ 的定義取決於平台:對於大多數來說,它不包含不間斷空格。
不在標準中且實施較少的是
%k
-
24 小時製時間,單位數字前麵有一個空格。
%l
-
12 小時製時間,單位數字前麵有一個空格。
%s
-
(僅限輸出。)自紀元以來的秒數。
%+
-
(僅輸出。)類似於
%c
,通常是"%a %b %e %H:%M:%S %Z %Y"
。可能取決於區域設置。
對於輸出,還有%O[dHImMUVwWy]
,它可以以替代的locale-dependent格式(例如,羅馬數字)發出數字,以及%E[cCyYxX]
,它可以使用替代的‘era’(例如,不同的宗教日曆)。其中受支持的是OS-dependent。這些被接受作為輸入,但具有標準解釋。
具體到R是%OSn
,對於輸出,將秒數截斷為0 <= n <= 6
小數位(如果%OS
後麵沒有數字,它使用的設置getOption("digits.secs")
,或者如果未設置,n =
0
)。進一步地,對於strptime
%OS
將輸入秒,包括秒的小數部分。注意%S
不讀取輸出的小數部分。
其他轉換規範的行為(即使以 %
開頭的其他字符序列是轉換規範)是特定於係統的。某些係統記錄不支持在 format
中使用多字節字符:UTF-8 語言環境不太可能導致問題。
值
format
方法和 strftime
返回表示時間的字符向量。 NA
時間返回為 NA_character_
。
strptime
將字符表示形式轉換為類的對象"POSIXlt"
。時區用於設置isdst
組件並設置"tzone"
屬性如果tz != ""
。如果指定的時間無效(例如‘“2010-02-30 08:00”’)結果的所有組成部分都是NA
。 (注意:這確實意味著它所說的 - 如果它是一個無效時間,而不僅僅是某個時區中不存在的時間。)
印刷年限
每個人都同意從 1000 到 9999 的年份應該用 4 位數字打印,但標準沒有定義在該範圍之外要做什麽。對於 0 到 999 年,大多數操作係統都會用零或空格填充 4 個字符,但 Linux/glibc 隻輸出數字。
操作係統設施可能不會打印 1 CE(又名 1 AD)之前的年份‘correctly’(它們傾向於假設存在 0 年:請參閱https://en.wikipedia.org/wiki/0_(year),有些操作係統完全錯誤)。常見格式為 -45
和 -045
。
9999之後和-999之前的年份通常打印有五個或更多字符。
某些平台支持 POSIX 2008(及其他平台)的修飾符。在 Linux/glibc 上的格式"%04Y"
確保至少四個字符和零填充(默認為無填充)。內部代碼(在 Windows 上使用,在 macOS 上默認使用)默認使用零填充(這可以通過環境變量控製)R_PAD_YEARS_BY_ZERO)。在這些平台上,格式%04Y
,%_4Y
和%_Y
可分別用於零、空格和無填充。 (在 macOS 上,本機代碼(非默認)不支持這些,並使用零填充到 4 位數字。)
時區偏移
與 GMT(也稱為 UTC)的偏移是時區之間以及與 "POSIXct"
類之間轉換的一部分,但會造成困難,因為它們通常計算不正確。
它們通常具有與時區規範相反的符號(請參閱Sys.timezone
):正值位於子午線以東。盡管有些時區存在偏移量,如 +00:09:21(1900 年的巴黎)和 -00:44:30(利比裏亞,直到 1972 年),但偏移量通常被視為整數分鍾,並且最常見於RFC 5322 電子郵件標頭采用 -0800
等形式(例如,冬季在美國太平洋海岸使用)。
格式 %z
可用於輸入或輸出:它是一個字符串,通常是加號或減號,後跟兩位數字表示小時,兩位數字表示分鍾:標準規定,如果偏移量不確定,則應輸出空字符串,但是某些係統使用 +0000
或當年使用的時區的偏移量。 (在某些平台上,轉換為 "POSIXct"
後效果更好。某些平台僅識別小時或 half-hour 輸出偏移量。)
使用 %z
作為輸入對於 tz = "UTC"
最有意義。
來源
輸入使用 POSIX 函數 strptime
並輸出 C99 函數 strftime
。
然而,並非所有操作係統(尤其是 Windows)都提供strptime
那些這樣做的人發現了很多問題,所以自 2000 年以來R使用了來自‘的代碼分支glibc’。分叉的代碼使用係統的strftime
查找 locale-specific 日期和月份名稱以及任何 AM/PM 指示器。
在某些平台上(包括 Windows,默認情況下在 macOS 上)係統的strftime
被 IANA 修改的代碼替換(以及 C-level 日期時間代碼的大部分其餘部分)tzcode' 分配 (https://www.iana.org/time-zones)。
請注意,由於 strftime
用於輸出(而不是 wcsftime
),因此如果需要將參數 format
轉換為會話編碼。
注意
默認格式遵循 ISO 8601 國際標準的規則,該標準將一天表示為"2001-02-28"
和一個時間"14:01:02"
像這裏一樣使用前導零。 (ISO 形式不使用空格,可能是‘T’,分隔日期和時間:R默認情況下使用空格。)
對於strptime
,輸入字符串不需要完全指定日期:假設未指定的秒、分鍾或小時為零,未指定的年、月或日為當前。 (但是,如果指定了月份,則該月的日期必須由 %d
或 %e
指定,因為該月的當前日期不必對於指定的月份有效。)某些組件可能會返回為 NA
(但未知的tzone
組件由空字符串表示)。
如果指定的時區在您的係統上無效,則發生的情況是特定於係統的,但可能會被忽略。
請記住,在大多數時區,由於與“夏令時”(也稱為‘summer’)時間的轉換,有些時間不會發生,有些時間會發生兩次。 strptime
不會驗證此類時間(它不假定特定時區),但 as.POSIXct
的轉換會驗證此類時間。 strftime
的轉換和格式化/打印使用操作係統設施,並且可能會在 DST 轉換時返回不存在的時間的無意義結果。
在 C 語言環境中%c
必須是"%a %b %e %H:%M:%S %Y"
。由於 Windows 不符合規定(並且使用北美以外地區無法理解的日期格式),因此該格式被使用R在 Windows 上的所有語言環境中。
生成的每個字符串的長度限製為 2048 個字節strftime
和format
方法。來自R4.3.0 嘗試超過此值是一個錯誤(以前的版本會默默地截斷為 255 字節)。
例子
## locale-specific version of date()
format(Sys.time(), "%a %b %d %X %Y %Z")
## time to sub-second accuracy (if supported by the OS)
format(Sys.time(), "%H:%M:%OS3")
## read in date info in format 'ddmmmyyyy'
## This will give NA(s) in some non-English locales; setting the C locale
## as in the commented lines will overcome this on most systems.
## lct <- Sys.getlocale("LC_TIME"); Sys.setlocale("LC_TIME", "C")
x <- c("1jan1960", "2jan1960", "31mar1960", "30jul1960")
z <- strptime(x, "%d%b%Y")
## Sys.setlocale("LC_TIME", lct)
z
(chz <- as.character(z)) # same w/o TZ
## *here* (but not in general), the same as format():
stopifnot(exprs = {
identical(chz, format(z))
grepl("^1960-0[137]-[03][012]$", chz[!is.na(z)])
})
## read in date/time info in format 'm/d/y h:m:s'
dates <- c("02/27/92", "02/27/92", "01/14/92", "02/28/92", "02/01/92")
times <- c("23:03:20", "22:29:56", "01:03:30", "18:21:03", "16:56:26")
x <- paste(dates, times)
z2 <- strptime(x, "%m/%d/%y %H:%M:%S")
z2
## *here* (but not in general), the same as format():
stopifnot(identical(format(z2), as.character(z2)))
## time with fractional seconds
z3 <- strptime("20/2/06 11:16:16.683", "%d/%m/%y %H:%M:%OS")
z3 # prints without fractional seconds by default, digits.sec = NULL ("= 0")
op <- options(digits.secs = 3)
z3 # shows the 3 extra digits
as.character(z3) # ditto
options(op)
## time zone names are not portable, but 'EST5EDT' comes pretty close.
z4 <- strptime(c("2006-01-08 10:07:52", "2006-08-07 19:33:02"),
"%Y-%m-%d %H:%M:%S", tz = "EST5EDT")
z4
attr(z4, "tzone")
as.character(z4)
z4$sec[2] <- pi # "very" fractional seconds
as.character(z4) # shows full precision
format(z4) # no fractional sec
format(z4, digits=8) # shows only 6 (hard-wired maximum)
format(z4, digits=4)
## An RFC 5322 header (Eastern Canada, during DST)
## In a non-English locale the commented lines may be needed.
## prev <- Sys.getlocale("LC_TIME"); Sys.setlocale("LC_TIME", "C")
strptime("Tue, 23 Mar 2010 14:36:38 -0400", "%a, %d %b %Y %H:%M:%S %z")
## Sys.setlocale("LC_TIME", prev)
## Make sure you know what the abbreviated names are for you if you wish
## to use them for input (they are matched case-insensitively):
format(s1 <- seq.Date(as.Date('1978-01-01'), by = 'day', len = 7), "%a")
format(s2 <- seq.Date(as.Date('2000-01-01'), by = 'month', len = 12), "%b")
## Non-finite date-times :
format(as.POSIXct(Inf)) # "Inf" (was NA in R <= 4.1.x)
format(as.POSIXlt(c(-Inf,Inf,NaN,NA))) # were all NA
參考
International Organization for Standardization (2004, 2000, ...) ‘ISO 8601. Data elements and interchange formats - Information interchange - Representation of dates and times.’, slightly updated to International Organization for Standardization (2019) ‘ISO 8601-1:2019. Date and time - Representations for information interchange - Part 1: Basic rules’, and further amended in 2022. For links to versions available on-line see (at the time of writing) https://dotat.at/tmp/ISO_8601-2004_E.pdf and https://www.qsl.net/g1smd/isopdf.htm; for information on the current official version, see https://www.iso.org/iso/iso8601 and https://en.wikipedia.org/wiki/ISO_8601.
The POSIX 1003.1 standard, which is in some respects stricter than ISO 8601.
也可以看看
DateTimeClasses 了解日期時間類的詳細信息; locales 查詢或設置區域設置。
您的係統幫助頁麵strftime
可以查看如何指定其格式。 (在某些係統上,包括 Windows,strftime
被更全麵的內部代碼取代。)
相關用法
- R strsplit 分割字符向量的元素
- R strtoi 將字符串轉換為整數
- R strrep 重複字符向量的元素
- R strwrap 將字符串換行以設置段落格式
- R strtrim 將字符串修剪為指定的顯示寬度
- R structure 屬性規範
- R stop 停止函數執行
- R standardGeneric 形式化方法係統 – 調度 S4 方法
- R startsWith 字符串是否以另一個字符串開頭或結尾?
- R stopifnot 確保 R 表達式的真實性
- R seq.Date 生成規則的日期序列
- R search 給出 R 對象的搜索路徑
- R solve 求解方程組
- R scan 讀取數據值
- R sprintf 使用 C 風格字符串格式化命令
- R sign 標誌函數
- R svd 矩陣的奇異值分解
- R source 從文件、連接或表達式中讀取 R 代碼
- R sQuote 引用文字
- R switch 選擇替代方案列表之一
- R substitute 替換和引用表達式
- R split 分組並重新集合
- R slice.index 數組中的切片索引
- R sort 對向量進行排序或排序
- R sequence 創建序列向量
注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Date-time Conversion Functions to and from Character。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。