用于格式化和解析的日期时间模式
在 Spark 中使用日期时间的几种常见场景
-
CSV/JSON 数据源使用模式字符串来解析和格式化日期时间内容。
-
与将
StringType
转换为/从DateType
或TimestampType
相关的日期时间函数。例如,unix_timestamp
、date_format
、to_unix_timestamp
、from_unixtime
、to_date
、to_timestamp
、from_utc_timestamp
、to_utc_timestamp
等。
Spark 在以下表格中使用模式字母进行日期和时间戳的解析和格式化
符号 | 含义 | 表示 | 示例 |
---|---|---|---|
G | 纪元 | 文本 | AD; 公元 |
y | 年 | 年 | 2020; 20 |
D | 年中的天数 | 数字(3) | 189 |
M/L | 年中的月份 | 月份 | 7; 07; Jul; July |
d | 月中的天数 | 数字(2) | 28 |
Q/q | 年的季度 | 数字/文本 | 3; 03; Q3; 第 3 季度 |
E | 星期几 | 文本 | Tue; Tuesday |
F | 月中的对齐星期几 | 数字(1) | 3 |
a | 上午/下午 | 上午/下午 | PM |
h | 上午/下午的时钟小时 (1-12) | 数字(2) | 12 |
K | 上午/下午的小时 (0-11) | 数字(2) | 0 |
k | 一天中的时钟小时 (1-24) | 数字(2) | 1 |
H | 一天中的小时 (0-23) | 数字(2) | 0 |
m | 小时中的分钟 | 数字(2) | 30 |
s | 分钟中的秒 | 数字(2) | 55 |
S | 秒的几分之一 | 分数 | 978 |
V | 时区 ID | 时区 ID | America/Los_Angeles; Z; -08:30 |
z | 时区名称 | 时区名称 | 太平洋标准时间; PST |
O | 本地化时区偏移量 | 偏移量-O | GMT+8; GMT+08:00; UTC-08:00; |
X | 时区偏移量,零为 'Z' | 偏移量-X | Z; -08; -0830; -08:30; -083015; -08:30:15; |
x | 时区偏移量 | 偏移量-x | +0000; -08; -0830; -08:30; -083015; -08:30:15; |
Z | 时区偏移量 | 偏移量-Z | +0000; -0800; -08:00; |
‘ | 文本转义 | 分隔符 | |
’‘ | 单引号 | 字面量 | ’ |
[ | 可选部分开始 | ||
] | 可选部分结束 |
模式字母的数量决定了格式。
-
文本:文本样式根据使用的模式字母数量确定。少于 4 个模式字母将使用简短文本形式,通常是缩写,例如星期一可能输出“Mon”。正好 4 个模式字母将使用完整文本形式,通常是完整描述,例如星期一可能输出“Monday”。5 个或更多字母将失败。
- 数字(n):这里的 n 代表这种日期时间模式可以使用的字母的最大数量。
- 在格式化中,如果字母的数量为 1,则使用最少的数字位数输出值,不进行填充,否则使用数字位数作为输出字段的宽度,并根据需要用零填充值。
- 在解析中,输入字段中需要精确的数字位数。
-
数字/文本:如果模式字母的数量为 3 个或更多,则使用上面的文本规则。否则使用上面的数字规则。
-
分数:使用一个或多个(最多 9 个)连续的
'S'
字符,例如SSSSSS
,来解析和格式化秒的几分之一。对于解析,可接受的分数长度可以是 [1,连续 ‘S’ 的数量]。对于格式化,分数长度将用零填充到连续 ‘S’ 的数量。Spark 支持微秒精度的日期时间,最多有 6 位有效数字,但可以解析纳秒,超出部分将被截断。 -
年:字母的数量决定了最小字段宽度,低于该宽度将使用填充。如果字母的数量为 2,则使用简化的两位数形式。对于打印,这将输出最右边的两位数字。对于解析,这将使用 2000 的基值进行解析,从而得到 2000 到 2099(含)之间的年份。如果字母的数量小于 4(但不是 2),则仅在负年份输出符号。否则,如果在 ‘G’ 不存在时超过填充宽度,则输出符号。7 个或更多字母将失败。
- 月:它遵循数字/文本的规则。文本形式取决于字母 - ‘M’ 表示“标准”形式,‘L’ 表示“独立”形式。这两种形式仅在某些语言中有所不同。例如,在俄语中,“Июль”是 7 月的独立形式,“Июля”是标准形式。以下是一些所有支持模式字母的示例
'M'
或'L'
:从 1 开始的一年中月份的数字。‘M’ 和 ‘L’ 之间没有区别。从 1 到 9 的月份不进行填充打印。spark-sql> select date_format(date '1970-01-01', "M"); 1 spark-sql> select date_format(date '1970-12-01', "L"); 12
'MM'
或'LL'
:从 1 开始的一年中月份的数字。对于 1-9 月份,添加零填充。spark-sql> select date_format(date '1970-1-01', "LL"); 01 spark-sql> select date_format(date '1970-09-01', "MM"); 09
'MMM'
:标准形式的简短文本表示。月份模式应是日期模式的一部分,而不仅仅是独立的月份,除非在英语等语言中,独立形式和标准形式之间没有区别。spark-sql> select date_format(date '1970-01-01', "d MMM"); 1 Jan spark-sql> select to_csv(named_struct('date', date '1970-01-01'), map('dateFormat', 'dd MMM', 'locale', 'RU')); 01 янв.
'LLL'
:独立形式的简短文本表示。它应该仅用于格式化/解析没有其他日期字段的月份。spark-sql> select date_format(date '1970-01-01', "LLL"); Jan spark-sql> select to_csv(named_struct('date', date '1970-01-01'), map('dateFormat', 'LLL', 'locale', 'RU')); янв.
'MMMM'
:标准形式的完整文本月份表示。它用于解析/格式化作为日期/时间戳一部分的月份。spark-sql> select date_format(date '1970-01-01', "d MMMM"); 1 January spark-sql> select to_csv(named_struct('date', date '1970-01-01'), map('dateFormat', 'd MMMM', 'locale', 'RU')); 1 января
'LLLL'
:独立形式的完整文本月份表示。该模式可以用于格式化/解析仅月份。spark-sql> select date_format(date '1970-01-01', "LLLL"); January spark-sql> select to_csv(named_struct('date', date '1970-01-01'), map('dateFormat', 'LLLL', 'locale', 'RU')); январь
-
上午/下午:这将输出一天中的上午/下午。模式字母数量必须为 1。
-
时区 ID(V):这将输出显示时区 ID。模式字母数量必须为 2。
-
时区名称(z):这将输出显示时区 ID 的文本名称。如果字母的数量为 1、2 或 3,则输出简短名称。如果字母的数量为 4,则输出完整名称。5 个或更多字母将失败。
-
偏移量 X 和 x:这将根据模式字母的数量格式化偏移量。一个字母仅输出小时,例如 ‘+01’,除非分钟不为零,在这种情况下也会输出分钟,例如 ‘+0130’。两个字母输出小时和分钟,不带冒号,例如 ‘+0130’。三个字母输出小时和分钟,带冒号,例如 ‘+01:30’。四个字母输出小时和分钟以及可选的秒,不带冒号,例如 ‘+013015’。五个字母输出小时和分钟以及可选的秒,带冒号,例如 ‘+01:30:15’。六个或更多字母将失败。模式字母 ‘X’(大写)将在输出的偏移量为零时输出 ‘Z’,而模式字母 ‘x’(小写)将输出 ‘+00’、‘+0000’ 或 ‘+00:00’。
-
偏移量 O:这将根据模式字母的数量格式化本地化偏移量。一个字母输出本地化偏移量的简短形式,即本地化偏移量文本,例如 ‘GMT’,带不带前导零的小时,可选的两位数分钟和秒(如果非零),以及冒号,例如 ‘GMT+8’。四个字母输出完整形式,即本地化偏移量文本,例如 ‘GMT’,带两位数小时和分钟字段,可选的秒字段(如果非零),以及冒号,例如 ‘GMT+08:00’。任何其他字母数量都将失败。
-
偏移量 Z:这将根据模式字母的数量格式化偏移量。一个、两个或三个字母输出小时和分钟,不带冒号,例如 ‘+0130’。当偏移量为零时,输出将为 ‘+0000’。四个字母输出本地化偏移量的完整形式,等效于偏移量-O 的四个字母。当偏移量为零时,输出将是相应的本地化偏移量文本。五个字母输出小时、分钟,以及可选的秒(如果非零),带冒号。如果偏移量为零,它将输出 ‘Z’。六个或更多字母将失败。
-
使用
[]
来定义可选部分,可以嵌套。在格式化过程中,所有有效数据都会被输出,即使它们位于可选部分。在解析过程中,整个可选部分可能从解析后的字符串中丢失。可选部分以[
开头,以]
结尾(或在模式的末尾)。 - ‘E’,‘F’,‘q’ 和 ‘Q’ 符号只能用于日期时间格式化,例如
date_format
。它们不允许用于日期时间解析,例如to_timestamp
。