django中navie time 和 aware time的使用和转换

在django中有关时间被分为navie time 和 aware time两种,前者指的是不带时区标记的时间格式,后者被认为是带有时区标记的时间格式。在django框架的setting.py文件中

LANGUAGE_CODE = ‘en-us‘
#TIME_ZONE 代表你所处的时区,刚创建时默认为‘UTC’即东0区(或西0区)
TIME_ZONE = ‘Asia/shanghai‘

USE_I18N = True

USE_L10N = True
#USE_TZ 为true代表使用带时区标记的aware时间格式
USE_TZ = True

在python中,默认将aware的时间设为UTC即东0区,

例如我们创建数据如下:

from django.shortcuts import render,reverse,redirect
from .models import Book
from django.utils.timezone import now,localtime

def add_book(request):
    if request.method==‘GET‘:
        return render(request,‘add_books.html‘)
    else:
        title = request.POST.get("book_title")
        author = request.POST.get("book_author")
        price = request.POST.get("book_price")
        book=Book(title=title,author=author,price=price,create_time=now())
        book.save()
        return redirect(reverse(‘index‘))

在数据库中存储的时间为:

可以看到其实真实的时间要比这个时间晚八个小时,这是因为我们处在东八区,而django会把时间设置成东0区,为什么会变成东0区呢?

我们需要看一看

django.utils.timezone.now

这个函数

def now():
    """
    Return an aware or naive datetime.datetime, depending on settings.USE_TZ.
    """
    if settings.USE_TZ:
        # timeit shows that datetime.now(tz=utc) is 24% slower
        return datetime.utcnow().replace(tzinfo=utc)
    else:
        return datetime.now()

可以看到,通过django.utils.timezone.now函数,虽然我们调用了now函数,但这个函数实质上,先判断

USE_TZ值是否为true,如果为true就将date.now中的datetime转化成utc时区的时间,如果为false,就直接使用datetime这个时间,所以有两种解决办法:1、将
USE_TZ的值设置为false,2、先设置本地时区,然后通过localtime将东0区的时间转换成本地时区的时间。我们推荐第二种做法,这是因为,第一种做法在不部署服务器时是可行的,在部署到服务器上使用linux操作系统时不可行的。第二种的做法如下:1.设置本地时区,在setting.py文件中设置本地时区为Asia/shanghai
TIME_ZONE = ‘Asia/shanghai‘
然后,在模板渲染时导入tz模块,使用tz模块中的localtime方法转化:
{% extends ‘base.html‘ %}
{% load tz %}
{% block title %}
首页
{% endblock %}
{% block main %}

    <table>
    <thead>
    <tr>
        <th>序号</th>
        <th>书名</th>
        <th>作者</th>
        <th>价格(美元)</th>
        <th>上架时间</th>
    </tr>

    </thead>
    <tbody>
    {% for book in books %}
        <tr>
        <td>{{ book.title }}</td>
        <td>{{ book.author }}</td>
        <td>{{ book.price }}$</td>
        <td>{{ book.create_time|localtime }}</td>
        </tr>
    {% endfor %}

    </tbody>
    </table>

{% endblock %}
最后在前端页面上展示的时间就是我们的东京时间了:

原文地址:https://www.cnblogs.com/gaoshiguo/p/12292935.html

时间: 2024-10-15 18:35:38

django中navie time 和 aware time的使用和转换的相关文章

Django 中的时区

Django 中的时区 在现实环境中,存在有多个时区.用户之间很有可能存在于不同的时区,并且许多国家都拥有自己的一套夏令时系统.所以如果网站面向的是多个时区用户,只以当前时间为标准开发,便会在时间计算上产生错误. 为解决这个此类问题,在代码和数据库中统一使用 UTC 时间,仅在与最终用户进行交互时使用本地时间是一个很好的办法 Django 默认关闭时区支持,开启时区支持,需要在 settings 中设置 USE_TZ = True .最好同时安装 pytz 模块(pip install pytz

050:navie时间和aware时间详解

navie时间和aware时间: 什么是navie时间?什么是aware时间? navie时间:不知道自己的时间表示的是哪个时区的.也就是不知道自己几斤几两.比较幼稚. aware时间:知道自己的时间表示的是哪个时区的.也就是比较清醒. pytz库: 专门用来处理时区的库.这个库会经常更新一些时区的数据,不需要我们担心.并且这个库在安装Django的时候会默认的安装.如果没有安装,那么可以通过pip install pytz的方式进行安装. astimezone方法: 将一个时区的时间转换为另外

Django中的URL配置和模板

Django中的URL配置 : 实例: Python代码   urlpatterns = patterns('', # Example: # (r'^myweb/', include('myweb.foo.urls')), # Uncomment the admin/doc line below and add 'django.contrib.admindocs' # to INSTALLED_APPS to enable admin documentation: # (r'^admin/doc

django中的发送邮件功能

Django中内置了邮件发送功能,被定义在django.core.mail模块中发送邮件需要使用SMTP服务器, 常用的免费服务器有:163.126.QQ,下面以163邮件为例子: 注册163邮箱, 登录后设置--->POP3/SMTP/IMAP   中打开开发者模式 客户端的授权码' 的在项目的settings.py中加上 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST = 'smtp.163.c

django中的FBV和CBV

django中请求处理方式有2种:FBV 和 CBV 一.FBV FBV(function base views) 就是在视图里使用函数处理请求. 看代码: urls.py from django.conf.urls import url, include # from django.contrib import admin from mytest import views urlpatterns = [ # url(r'^admin/', admin.site.urls), url(r'^in

MAC中Django中runserver提示Can&#39;t connect to local MySQL server through socket &#39;/tmp/mysql.sock错误

好像不止遇到一次,直接Google就可以了,在stackoverflow中就有答案,答案就是你没有开MySQL - -. stackoverflow链接见 http://stackoverflow.com/questions/16325607/cant-connect-to-local-mysql-server-through-socket-tmp-mysql-sock 开启MySQL的命令如下: mysql.server start MAC中Django中runserver提示Can't co

django中models和forms阅读笔记

一.使用数据库需要设置settings.py文件. DATABASES = { 'default': { 'ENGINE': 'django.db.backends.', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'. 'NAME': '', # Or path to database file if using sqlite3. 'USER': '', # Not used with sqlite3. 'PASSWORD

django中migration文件是干啥的

昨天很蠢的问leader git push的时候会不会把本地的数据库文件上传上去,意思是django中那些migration文件修改之后会不会上传. 然后得知不会,因为所有的数据库都存在本机的mysql啊,怎么可能传过去呢?然后同时还有.gitignore文件啊,过滤了很多文件. 同时我以为migration文件就是数据库文件,然而实际上是什么呢? 是操作数据库的文件,会通过这个去创建一系列的表.看看内容就知道了: class Migration(SchemaMigration): def fo

Django中如何使用django-celery完成异步任务1(转)

原文链接: http://www.weiguda.com/blog/73/ 本篇博文主要介绍在开发环境中的celery使用,请勿用于部署服务器. 许多Django应用需要执行异步任务, 以便不耽误http request的执行. 我们也可以选择许多方法来完成异步任务, 使用Celery是一个比较好的选择, 因为Celery 有着大量的社区支持, 能够完美的扩展, 和Django结合的也很好. Celery不仅能在Django中使用, 还能在其他地方被大量的使用. 因此一旦学会使用Celery,