Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 702|回复: 0

解决-Django使用filter过滤时间,无法获取月份的问题

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-4-17 17:46:35 | 显示全部楼层 |阅读模式

    django中的filter日期查询属性有:year、month、day、week_day、hour、minute、second

    但是但我在使用过滤查询是却总是无法过滤出月份,各种查资料,最后才发现是时区问题,django查询数据库时对应的ORM语句会用使用mysql自带的一些时间处理函数如convert_tz(时间转换函数),而mysql无法获取Asia/Shanghai的正确时间,查询的时候返回空列表。

     

    --记录一下排查过程:

    *查看mysql日志文件,看Django查询数据时的ORM语句

    1. 打开mysql.cnf配置文件,注释掉68 69行:【环境是ubuntu】
      sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

    2. 重启mysql服务
      sudo  service mysql restart
    3. 查看日志
      sudo tail -f /var/log/mysql/mysql.log
      # Linux命令:tail命令: 默认会显示文件的末尾,可以动态查看文件新加入的数据

       

     *在另外一个终端进行django语句的执行:

    >>> p = Post.objects.filter(publish__year=2018,slug="view") #测试过滤年份,获取一条数据

    >>> p
    [<Post: 使用基于类的试图>]

    可以看到得到的日志如下:

    >>> c = Post.objects.filter(publish__month=4,slug="view")
    >>> c
    []   #还没解决时区问题的情况下是返回空的,所以在有可能在渲染页面时不能获得数据

     

     

    解决方法是在终端输入:

    # MySQL安装程序在mysql数据库中创建时区表,但不装载。所以必须手动装载

    mysql_tzinfo_to_sql /usr/share/zoneinfo

    # 然后重启数据库
    service mysql restart

    然后重新进入Django shell过滤数据,即可查得月份的数据

     

    这个方法也可以处理mysql设置时区时报错的问题

    使用SET GLOBAL time_zone = 'Asia/Shanghai';   命令设置时区
    会却报错ERROR 1298 (HY000): Unknown or incorrect time zone: 'Asia/Shanghai'。

    mysql默认的时区格式并不支持这种,而是写成 set time_zone='+8:00';这种格式,如果想要使用'Asia/Shanghai'的格式

    就要用mysql_tzinfo_to_sql程序用来装载时区表,也是在终端命令行输入如下命令,跟上面的一样

    mysql_tzinfo_to_sql /usr/share/zoneinfo   #第一种(一般第一种就可以了,推荐)
    mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -uroot mysql   #第二种
    mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -uroot --force mysql  #第三种

     

    ---了解,django中的时区问题

    django中有两个时间概念:naive time 与 active time。

    naive time:就是不带时区的时间,

    Active time就是带时区的时间。

    还有一个就是UTC时间,UTC时间表示的是格林尼治平均时即可,即零区时间

    datetime模块是python自带的包,timezone是django内的工具包,

    from datetime import date,datetime

    from django.utils import timezone

    使用datetime.datetime.utcnow()、datetime.datetime.now()输出的类似2015-05-11 09:10:33.080451就是不带时区的时间(naive time),而使用django.utils.timezone.now()输出的类似2015-05-11 09:05:19.936835+00:00的时间就是带时区的时间(Active time),其中+00:00表示的就是时区相对性。

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-12-22 18:10 , Processed in 0.061141 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表