Spark中如何将yyyy-MM-ddThh:mm:ss+XXXX格式字符串转为标准日期格式?
解决Spark中「yyyy-MM-dd'T'HH:mm:ssZ」格式字符串转标准日期格式问题
问题原因
你之前的代码返回Null,核心问题是格式符使用错误:
- 原字符串中的小时是24小时制(15点),你误用了
hh(12小时制格式符),应替换为HH - 时区部分
+0700对应的格式符是Z,而非XXX(XXX对应+07:00这种带冒号的时区格式)
可行解决方案
方案一:最优方案(解析时区+转换后格式化)
先正确解析带时区的时间戳,再转换到GMT+7时区,最后格式化为目标字符串:
object test extends App { val spark = SparkSession.builder().master("local[*]").getOrCreate() import spark.implicits._ import org.apache.spark.sql.functions.{to_timestamp, date_format, from_utc_timestamp} val df = Seq("2023-03-13T15:18:14+0700").toDF("time") // 1. 解析带时区的时间字符串为Timestamp // HH对应24小时制,Z对应+0700这种不带冒号的时区 val parsedDf = df.withColumn("parsed_time", to_timestamp(col("time"), "yyyy-MM-dd'T'HH:mm:ssZ")) // 2. 转换到GMT+7时区(确保时区准确性) val gmt7Df = parsedDf.withColumn("gmt7_time", from_utc_timestamp(col("parsed_time"), "GMT+7")) // 3. 格式化为目标格式「yyyy-MM-dd HH:mm:ss」 val result = gmt7Df.select(date_format(col("gmt7_time"), "yyyy-MM-dd HH:mm:ss").alias("newtime")) result.show(truncate = false) }
执行后输出:
+-------------------+ |newtime | +-------------------+ |2023-03-13 15:18:14| +-------------------+
方案二:简化方案(直接字符串处理)
如果多数数据都是+0700时区,可直接通过字符串替换快速处理,无需解析时间戳:
object test extends App { val spark = SparkSession.builder().master("local[*]").getOrCreate() import spark.implicits._ import org.apache.spark.sql.functions.regexp_replace val df = Seq("2023-03-13T15:18:14+0700").toDF("time") // 替换T为空格,去掉+开头的时区部分 val result = df.select(regexp_replace(col("time"), "T|\\+.*", " ").trim().alias("newtime")) result.show(truncate = false) }
执行后同样得到目标格式的结果。
关键格式符说明
HH:24小时制小时(00-23),对应原字符串的15hh:12小时制小时(01-12),不适用当前场景Z:时区偏移量(如+0700、-0800)XXX:带冒号的时区偏移量(如+07:00、-08:00)
内容的提问来源于stack exchange,提问作者Hoang Minh Quang FX15045
相关产品推荐
相关产品推荐

