Spark中PST转CET时间格式转换:YYYY-MM-DD HH:MM:SS实现求助
解决方案
要解决这个问题,核心是正确解析带时区的完整日期时间字符串,再完成时区转换,最后格式化输出。你之前的错误在于用了只处理日期的to_date,且格式串没匹配输入里的秒数和时区信息,导致解析失败。
完整代码示例
from pyspark.sql import SparkSession from pyspark.sql import functions as F # 初始化SparkSession,配置时区解析策略 spark = SparkSession.builder \ .appName("TimezoneConversion") \ .config("spark.sql.legacy.timeParserPolicy", "LEGACY") \ .getOrCreate() # 模拟测试数据 data = [("Mar 1, 2022 01:00:00 PM PST",)] df = spark.createDataFrame(data, ["input_datetime"]) # 步骤1:解析带时区的字符串为Timestamp类型 # 格式串完全匹配输入结构:MMM d, yyyy hh:mm:ss aa zzz df = df.withColumn("parsed_ts", F.to_timestamp(F.col("input_datetime"), "MMM d, yyyy hh:mm:ss aa zzz")) # 步骤2:将PST时区的Timestamp转换为CET时区 # 推荐用完整时区ID避免夏令时歧义,比如America/Los_Angeles对应PST/PDT,Europe/Paris对应CET/CEST df = df.withColumn("cet_ts", F.from_utc_timestamp(F.to_utc_timestamp(F.col("parsed_ts"), "America/Los_Angeles"), "Europe/Paris")) # 步骤3:格式化为YYYY-MM-DD HH:MM:SS字符串 df = df.withColumn("output_datetime", F.date_format(F.col("cet_ts"), "yyyy-MM-dd HH:mm:ss")) # 查看结果 df.show(truncate=False)
关键说明
- 必须用
to_timestamp替代to_date:to_date仅处理日期部分,无法解析包含时间、时区的完整字符串,会直接导致解析失败。 - 格式串要完全匹配输入:
"MMM d, yyyy hh:mm:ss aa zzz"对应输入里的月份缩写、带逗号的日期、4位年份、12小时制时分秒、AM/PM标识、时区缩写。 - 时区转换优先用完整ID:比如
America/Los_Angeles比PST更准确,能自动处理夏令时切换的问题。 - Spark 3.0+可用
from_utc_timestamp+to_utc_timestamp组合,直接完成跨时区转换,逻辑更清晰。
输出结果
+-----------------------------+-------------------+-------------------+-------------------+ |input_datetime |parsed_ts |cet_ts |output_datetime | +-----------------------------+-------------------+-------------------+-------------------+ |Mar 1, 2022 01:00:00 PM PST |2022-03-01 13:00:00|2022-03-01 22:00:00|2022-03-01 22:00:00| +-----------------------------+-------------------+-------------------+-------------------+
内容的提问来源于stack exchange,提问作者Data writer
相关产品推荐
相关产品推荐

