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

如何在SQL Server中将UTC时间转换为本地时间?

UTC时间转美国中部时间(含夏令时)的实现方案

我们的数据库用UTC格式的datetime字段跟踪事件,虽然保证了准确性,但非技术用户难以理解,也没法和带本地时间戳的文件等事件匹配。比如导出订单时,需要确定订单的录入日期。现有订单数据示例:

OrderHeaderIDCustomerIDLastModifiedCreatedBy
0E8B2F2F-6D7A-40DF-87CD-B00EF4801F07EXQHA2024-07-23 14:35:46.00010094:sreiley
D28EB7C4-7CB0-4347-8D5E-CC4D07A657D8SHOLFA2024-07-23 14:34:30.00010094:cstaykov

美国中部时间(US Central Time)存在夏令时差异:午夜到下午6点(夏令时为下午7点)期间,UTC日期和本地日期一致;但超过这个时间段到午夜,UTC日期会超前一天,这直接影响我们两天内交付的承诺。以下是不同场景下的转换实现方法:

一、数据库层面直接转换

1. SQL Server

使用AT TIME ZONE函数,自动处理夏令时:

SELECT 
    OrderHeaderID,
    CustomerID,
    LastModified AT TIME ZONE 'UTC' AT TIME ZONE 'Central Standard Time' AS LastModified_CST,
    CreatedBy
FROM OrderHeader;

Central Standard Time是SQL Server内置时区名称,会自动识别夏令时并转换为CDT。

2. MySQL

使用CONVERT_TZ函数,需确保时区表已加载:

SELECT 
    OrderHeaderID,
    CustomerID,
    CONVERT_TZ(LastModified, '+00:00', 'America/Chicago') AS LastModified_CST,
    CreatedBy
FROM OrderHeader;

America/Chicago对应美国中部时区,MySQL会自动处理夏令时切换。

3. PostgreSQL

使用AT TIME ZONE语法:

SELECT 
    OrderHeaderID,
    CustomerID,
    LastModified AT TIME ZONE 'UTC' AT TIME ZONE 'America/Chicago' AS LastModified_CST,
    CreatedBy
FROM OrderHeader;

PostgreSQL支持America/Chicago时区名称,自动适配夏令时规则。

二、应用程序层面转换

1. Python

Python 3.9+可使用内置zoneinfo模块:

from datetime import datetime
from zoneinfo import ZoneInfo

# 解析UTC时间并标记时区
utc_time = datetime.strptime('2024-07-23 14:35:46', '%Y-%m-%d %H:%M:%S').replace(tzinfo=ZoneInfo('UTC'))
# 转换为美国中部时间
cst_time = utc_time.astimezone(ZoneInfo('America/Chicago'))
print(cst_time.strftime('%Y-%m-%d %H:%M:%S'))

旧版本可使用pytz库兼容:

import pytz
from datetime import datetime

utc_time = datetime.strptime('2024-07-23 14:35:46', '%Y-%m-%d %H:%M:%S')
utc_tz = pytz.utc
cst_tz = pytz.timezone('America/Chicago')
cst_time = utc_tz.localize(utc_time).astimezone(cst_tz)
print(cst_time.strftime('%Y-%m-%d %H:%M:%S'))

2. C#

使用TimeZoneInfo类自动处理夏令时:

DateTime utcTime = DateTime.Parse("2024-07-23 14:35:46").ToUniversalTime();
TimeZoneInfo cstZone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
DateTime cstTime = TimeZoneInfo.ConvertTimeFromUtc(utcTime, cstZone);
Console.WriteLine(cstTime.ToString("yyyy-MM-dd HH:mm:ss"));

关键注意事项

  • 确保数据库中存储的是明确标记为UTC的时间,避免时区歧义。
  • 夏令时切换规则由系统内置时区数据库维护,无需手动处理切换日期。
  • 若仅需提取本地日期,转换后直接获取Date部分即可保证与本地日期一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 16:42:39