日期时间格式化和解析模式
在Spark中,datetime的使用有几种常见场景:
-
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 | 纪元 | 文本 | 公元; 公元纪年 |
y | 年 | 年 | 2020; 20 |
D | 一年中的第几天 | 数字(3) | 189 |
M/L | 一年中的第几个月 | 月份 | 7; 07; 七月; July |
d | 一个月中的第几天 | 数字(2) | 28 |
Q/q | 一年中的第几季度 | 数字/文本 | 3; 03; Q3; 第三季度 |
E | 星期中的第几天 | 文本 | 星期二; Tuesday |
F | 一个月中对齐的星期几 | 数字(1) | 3 |
a | 一天中的上午/下午 | 上午/下午 | 下午 |
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 | 美国/洛杉矶; 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个模式字母将使用完整文本格式,通常是完整描述,例如,星期几的“星期一”可能输出“星期一”。5个或更多字母将失败。
-
数字(n):这里的n表示此类型的日期时间模式可使用的字母最大计数。
- 在格式化时,如果字母的计数为1,则值将使用最小数量的位输出且不进行填充,否则,位数计数将作为输出字段的宽度,值根据需要进行零填充。
- 在解析时,期望输入字段中的数字计数是准确的。
-
数字/文本:如果模式字母的计数为3或更多,则使用上述文本规则。否则,使用上述数字规则。
-
分数:使用一个或多个(最多9个)连续的
'S'
字符,例如SSSSSS
,来解析和格式化秒的分数。 在解析时,接受的分数长度可以是 [1, 连续‘S’的数量]。 在格式化时,分数长度将填充到连续‘S’的数量,并补零。 Spark支持微秒级的日期时间精度,最多有6个有效数字,但可以解析纳秒,其超出部分被截断。 -
年:字母的数量决定了最小字段宽度,低于该宽度时使用填充。如果字母的数量为2,则使用减少的两位形式。用于打印时,这将输出最右侧的两位数字。用于解析时,这将使用2000的基值进行解析,结果是年份在2000到2099之间(包括)。如果字母的数量少于四个(但不为2),则仅对负年份输出符号。否则,当‘G’不存在时,如果超出了填充宽度,则输出符号。7个或更多字母将失败。
-
月份:它遵循数字/文本的规则。文本形式依赖于字母 - ‘M’表示‘标准’形式,‘L’表示‘单独’形式。这两种形式在某些特定语言中是不同的。例如,在俄语中,‘Июль’是七月的单独形式,‘Июля’是标准形式。以下是所有支持的模式字母的示例:
-
'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 ), map(, , , )); 01 янв.
-
'LLL'
:单独形式的短文本表示。它仅应用于格式化/解析没有其他日期字段的月份。spark-sql> select date_format(date , "LLL"); Jan spark-sql> select to_csv(named_struct(, date ), map(, , , )); янв.
-
'MMMM'
:标准形式的完整文本月份表示。它用于解析/格式化作为日期/时间戳的一部分的月份。spark-sql> select date_format(date , "d MMMM"); 1 January spark-sql> select to_csv(named_struct(, date ), map(, , , )); 1 января
-
'LLLL'
:单独形式的完整文本月份表示。该模式仅可用于格式化/解析月份。spark-sql> select date_format(date , "LLLL"); January spark-sql> select to_csv(named_struct(, date ), map(, , , )); январь
-
-
am-pm:这输出当天的am-pm。模式字母的计数必须为1。
-
时区ID(V):这输出显示时区ID。模式字母的计数必须为2。
-
时区名称(z):这输出显示时区ID的文本名称。如果字母的计数为1、2或3,则输出短名称。如果字母的计数为4,则输出全名。五个或更多字母将失败。
-
偏移量X和x:根据模式字母的数量格式化偏移量。一个字母仅输出小时,例如‘+01’,除非分钟不为零,此时分钟也将输出,例如‘+0130’。两个字母输出小时和分钟,没有冒号,例如‘+0130’。三个字母输出小时和分钟,有冒号,例如‘+01:30’。四个字母输出小时和分钟和可选的秒,没有冒号,例如‘+013015’。五个字母输出小时和分钟和可选的秒,有冒号,例如‘+01:30:15’。六个或更多字母将失败。模式字母‘X’(大写)在偏移量为零时输出‘Z’,而模式字母‘x’(小写)输出‘+00’,‘+0000’或‘+00:00’。
-
偏移量O:根据模式字母的数量格式化本地化偏移量。一个字母输出本地化偏移量的短格式,即本地化偏移量文本,例如‘GMT’,小时没有前导零,选择性2位数字的分钟和秒(如果非零)和冒号,例如‘GMT+8’。四个字母输出完整形式,即本地化偏移量文本,例如‘GMT’,有2位数字的小时和分钟字段,选择性秒字段(如果非零)和冒号,例如‘GMT+08:00’。任何其他字母计数将失败。
-
偏移量Z:根据模式字母的数量格式化偏移量。一个、两个或三个字母输出小时和分钟,没有冒号,例如‘+0130’。当偏移量为零时,输出将是‘+0000’。四个字母输出本地化偏移量的完整形式,相当于偏移量O的四个字母。如果偏移量为零,输出将是相应的本地化偏移量文本。五个字母输出小时、分钟和可选的秒(如果非零),并有冒号。如果偏移量为零,则输出‘Z’。六个或更多字母将失败。
-
可选部分开始和结束:使用
[]
定义一个可选部分,也可以是嵌套的。 在格式化期间,所有有效数据将输出,即使它在可选部分中。 在解析期间,整个部分可能缺失于解析的字符串中。 可选部分通过[
开始,并用]
结束(或在模式的末尾)。 -
符号‘E’,‘F’,‘q’和‘Q’仅可用于日期时间格式化,例如
date_format
。它们不允许用于日期时间解析,例如to_timestamp
。