OMR转换时间时区后返回
classConvertTZ(Func):function='CONVERT_TZ'output_field=models.DateTimeField()# 支持多种调用方式def__init__(self,expression,from_tz,to_tz):super(ConvertTZ,self).__init__(expression,Value(from_tz),Value(to_tz))

使用 F() 表达式或字段名进行时区转换

在 Django 中处理时区转换时,可以使用F()表达式或直接使用字段名字符串。from_tzto_tz参数需要使用时区字符串(如'UTC''Asia/Shanghai'),而不是时区对象。

时区字符串的注意事项

确保from_tzto_tz使用有效的时区字符串,例如:

  • 'UTC'
  • 'America/New_York'
  • 'Asia/Tokyo'

无效的时区字符串会导致错误。可以通过pytz.all_timezones查看所有支持的时区字符串。

解决 MySQL 时区数据加载问题

问题描述
使用ConvertTZ函数时出现'字段名': None结果,原因是 MySQL 的mysql.time_zone_name表未加载时区数据。


Linux/macOS 解决方案
通过系统自带的时区文件加载数据:

  1. 执行加载命令
    在终端运行以下命令,将系统时区数据导入 MySQL:

    mysql_tzinfo_to_sql /usr/share/zoneinfo|mysql-uroot-pmysql
    • /usr/share/zoneinfo是系统时区文件目录
    • -p提示输入 MySQL root 密码
  2. 重启 MySQL 服务
    确保更改生效:

    # systemd 系统(如 Ubuntu 16.04+、CentOS 7+)sudosystemctl restart mysql# 旧版系统sudoservicemysql restart

Windows 解决方案
手动下载并导入时区数据:

  1. 从 MySQL 官网下载时区数据包:
    https://dev.mysql.com/downloads/timezones.html

  2. 解压后执行 SQL 文件:

    mysql-uroot-pmysql<timezone_posix.sql

验证时区数据
执行以下 SQL 查询,确认时区数据已加载:

SELECT*FROMmysql.time_zone_nameLIMIT10;

正常应返回时区名称列表而非空结果。