You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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),对应原字符串的15
  • hh:12小时制小时(01-12),不适用当前场景
  • Z:时区偏移量(如+0700、-0800)
  • XXX:带冒号的时区偏移量(如+07:00、-08:00)

内容的提问来源于stack exchange,提问作者Hoang Minh Quang FX15045

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 09:25:43