用于格式化和解析的日期时间模式
在 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 | 纪元 | 文本 | 公元; Anno Domini |
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 | 时区名称 | 时区名称 | Pacific Standard Time; 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’ 表示“独立”形式。 这两种形式仅在某些特定语言中有所不同。 例如,在俄语中,“Июль”是七月的独立形式,而“Июля”是标准形式。 这是所有受支持的模式字母的示例
'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”。 6 个或更多字母将失败。 模式字母 “X”(大写)将在要输出的偏移量为零时输出 “Z”,而模式字母 “x”(小写)将输出 “+00”、“+0000” 或 “+00:00”。
-
偏移量 O:这会根据模式字母的数量格式化本地化偏移量。 一个字母输出本地化偏移量的简短形式,即本地化偏移量文本,例如 “GMT”,小时不带前导零,可选的 2 位数分钟和秒(如果非零)以及冒号,例如 “GMT+8”。 四个字母输出完整形式,即本地化偏移量文本,例如 “GMT”,带 2 位数小时和分钟字段,可选的秒字段(如果非零)以及冒号,例如 “GMT+08:00”。 任何其他字母计数将失败。
-
偏移量 Z:这会根据模式字母的数量格式化偏移量。 一个、两个或三个字母输出小时和分钟,不带冒号,例如 “+0130”。 当偏移量为零时,输出将为 “+0000”。 四个字母输出本地化偏移量的完整形式,相当于四个字母的偏移量-O。 如果偏移量为零,则输出将为相应的本地化偏移量文本。 五个字母输出小时、分钟,如果非零,则带可选的秒,并带有冒号。 如果偏移量为零,则输出 “Z”。 6 个或更多字母将失败。
-
可选部分开始和结束:使用
[]
定义一个可选部分,并且可以嵌套。 在格式化期间,即使所有有效数据都在可选部分中,也会输出所有有效数据。 在解析期间,整个部分可能会从解析的字符串中缺失。 可选部分以[
开头,以]
结尾(或在模式末尾)。 - “E”、“F”、“q” 和 “Q” 的符号只能用于日期时间格式化,例如
date_format
。 不允许用于日期时间解析,例如to_timestamp
。