You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

将XML时间戳转换为PostgreSQL兼容格式及Python实现方法

嘿,这个问题我之前处理过,其实不用太纠结格式——PostgreSQL对ISO 8601格式的时间戳支持很好,不过如果你确实需要转换成指定样式,或者要在Python里预处理,下面分两种场景给你讲清楚:

一、直接在PostgreSQL中处理时间戳

首先要明确:PostgreSQL的timestamp with time zone(简称timestamptz)类型原生支持你原始的2018-04-02T09:00:00+09:30格式,完全可以直接插入,不需要提前转换。比如执行这条SQL就没问题:

INSERT INTO your_table (your_tz_column) VALUES ('2018-04-02T09:00:00+09:30');

如果一定要转换成你提到的2018-04-02 09:00:00 +09.30格式,可以用TO_CHAR函数配合字符串替换来实现:

SELECT 
  TO_CHAR('2018-04-02T09:00:00+09:30'::timestamptz, 'YYYY-MM-DD HH24:MI:SS ') ||
  REPLACE(TO_CHAR('2018-04-02T09:00:00+09:30'::timestamptz, 'OF'), ':', '.');

这条语句先格式化日期时间部分,再把时区偏移里的:替换成.,最终输出就是你要的样式。

二、用Python预处理XML中的时间戳

如果需要在加载到数据库前用Python处理,推荐两种方法:

方法1:用Python标准库datetime

不需要额外安装依赖,直接解析并格式化:

from datetime import datetime

original_ts = "2018-04-02T09:00:00+09:30"
# 解析ISO格式的时间戳
dt_obj = datetime.fromisoformat(original_ts)
# 处理时区偏移的格式:把+0930转换成+09.30
tz_offset = dt_obj.strftime("%z")
formatted_tz = f"{tz_offset[:3]}.{tz_offset[3:]}"
# 拼接成目标格式
target_ts = f"{dt_obj.strftime('%Y-%m-%d %H:%M:%S')} {formatted_tz}"
print(target_ts)  # 输出: 2018-04-02 09:00:00 +09.30

方法2:用dateutil库(更省心)

如果你的XML里有各种奇怪的时间格式,dateutil的解析能力更强,先安装依赖:

pip install python-dateutil

然后代码:

from dateutil import parser

original_ts = "2018-04-02T09:00:00+09:30"
dt_obj = parser.parse(original_ts)
# 同样处理时区偏移
tz_offset = dt_obj.strftime("%z")
formatted_tz = f"{tz_offset[:3]}.{tz_offset[3:]}"
target_ts = f"{dt_obj.strftime('%Y-%m-%d %H:%M:%S')} {formatted_tz}"
print(target_ts)

额外小技巧:直接传Python datetime对象给PostgreSQL

其实如果你的数据库列是timestamptz,完全可以跳过手动格式化,直接把带时区的datetime对象传给psycopg2驱动,它会自动处理格式,更安全不容易出错:

import psycopg2
from datetime import datetime

# 建立数据库连接
conn = psycopg2.connect("dbname=your_db user=your_user password=your_pass host=your_host")
cur = conn.cursor()

# 解析时间戳
dt_obj = datetime.fromisoformat("2018-04-02T09:00:00+09:30")
# 直接传入参数
cur.execute("INSERT INTO your_table (your_tz_column) VALUES (%s)", (dt_obj,))

conn.commit()
cur.close()
conn.close()

内容的提问来源于stack exchange,提问作者Derek Lee

火山引擎 最新活动