如此处所述我正在使用以下代码:
use sqlx::Executor;
use sqlx::postgres::PgPoolOptions;
let pool = PgPoolOptions::new()
.after_connect(|conn, _meta| Box::pin(async move {
conn.execute("SET TIME ZONE 'Europe/Berlin';").await?;
let result: (time::OffsetDateTime,) = sqlx::query_as("SELECT current_timestamp").fetch_one(conn).await?;
println!("Current Time in Europe/Berlin: {}", result.0);
Ok(())
}))
.connect("postgres:// …").await?;
结果是:
Current Time in Europe/Berlin: 2024-02-06 22:39:37.194022 +00:00:00
这是错误的,因为当前柏林时间是“23”而不是“22”(UTC)。
我的数据库当前默认采用 UTC(来自 postgresql.conf 文件)。
如果我在 Postgresql 查询中使用以下代码,它就会起作用:
SET TIME ZONE 'Europe/Berlin';
SELECT current_timestamp;
我哪里错了?
0.7.3
"macros", "postgres", "runtime-tokio", "time"
Postgres v16.1
Windows 10
rustc --version
:rustc 1.75.0 (82e1608df 2023-12-21)
柏林的当前 UTC 时间与东京的当前 UTC 时间相同。时间戳是正确的,您添加到其中的文本也没有错误 - 只是整个事情非常混乱,因为如果您在时区感知时间戳上操作,则位置与当前时间无关,表示绝对时间点。
不用说,在查询中执行
set time zone
对 Rust 应用程序时区偏移配置没有影响 - time
使用系统的偏移量。如果您的目标是让 Rust 应用程序打印出 2024-02-06 23:39:37.194022 +01:00:00
,则必须更改系统或应用程序的时区。您保存到 timestamp
的 with
time zone
OffsetDateTime
的值不会受到影响,只是输出格式发生变化 - 同样,这些时间戳是绝对的。
at time zone
会返回该时间,这意味着剥离时区信息,为您提供在给定时区的某个位置拍摄的“时钟照片”。
select now();
现在 |
---|
2024-02-07 07:23:15.314852+00 |
set time zone 'Europe/Berlin';
select now();
现在 |
---|
2024-02-07 08:23:15.316844+01 |
set time zone 'Europe/Berlin';
select now() at time zone 'UTC'
时区 |
---|
2024-02-07 07:23:15.317335 |