3

我正在开发的应用程序以美国为目标用户。而且(您可能知道)在美国有不止一个时区。所以我有一些疑问:

  • 那么如何根据当前用户获取服务器端的当前时间呢?
  • 我如何存储DateTime数据以显示每个用户的正确时间?
  • 我如何比较时间(例如:)user.event.created > datetime.now()?将.now()使用哪个时区?
  • settings.py我应该在文件中设置什么 TIME_ZONE 。

这是一个 API,不能通过 JS 获取用户的时区。我通过 TokenAuthentication 获取当前用户。

4

4 回答 4

1

使用UTCforsettings.py并从 Javascript 中获取他们的时区偏移量:

var utcOffset = -((new Date()).getTimezoneOffset()) / 60;

例如现在的洛杉矶utcOffset == -7

不幸的是,这并没有考虑到以后的夏令时更改(偏移更改为-8),因此您可能必须在检索时弄清楚这一点才能获得Pacific/Los_Angeles. 否则,您总是可以在注册表单中询问用户这对您的业务是否重要。

编辑:由于您使用的是 API,您还可以尝试使用IPInfoDB API根据客户端 IP 地址进行地理定位。它并不总是完全准确,但几乎总是足以获得正确的时区。

于 2015-09-03T17:45:42.793 回答
0

解决方案是始终将 unix 时间戳存储在数据库中。您可以使用time.time(). 这意味着您的模型应该有一个 Floatfield(甚至是 BigIntegerField,具体取决于所需的精度)。

您的模板应按原样显示数值。然后,您需要一点点 javascript 来将该 unix 时间戳转换为日期时间。

new Date(unix_timestamp);
于 2015-09-04T01:23:11.337 回答
0

不要使用 datetime.now(),而是使用 timezone 模块中的 now() 函数。

from django.utils import timezone

now = timezone.now()

Django 会找出你所在的时区并相应地比较它们。

user.event.created > timezone.now()

https://docs.djangoproject.com/en/1.8/topics/i18n/timezones/

于 2015-09-03T19:21:34.547 回答
0

您的 webapp 的用户可能处于不同的时区,因此需要转换为适当的时区。您可以创建一个中间件并使用激活函数来设置适当的时区。您可以通过在登录页面中对Free IP Geolocation API进行 ajax api 调用来获取客户端时区,并且时区值可以保存在 cookie 变量中,以后可以在中间件中访问该变量。

登陆页面.html

<script>
$.ajax({
        url: 'https://freegeoip.app/json/',
        dataType: 'json',
        success: function (data) {
            document.cookie = 'timezone=' + data['time_zone'] + '; path=/';
        }
      });
</script>

中间件.py

import pytz
import requests

from django.utils import timezone

class TimezoneMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

def __call__(self, request):
    
    tzname = request.COOKIES.get('timezone')
    if tzname:
        timezone.activate(pytz.timezone(tzname))
    else:
        timezone.deactivate()
    return self.get_response(request)

设置.py

MIDDLEWARE = [      ........
            'projectname.middleware.TimezoneMiddleware',

]

于 2020-11-06T22:20:14.830 回答