2015-03-31 94 views
2

我遇到了一个与我的客户端服务器基于Web的应用程序有关的问题。 我开发了一个使用Django框架的门户。我的服务器位于AWS(弗吉尼亚北部)。它是一种时间警报应用程序。我的问题是当我从印度的UI方面设置时间时,它按照印度时间进行存储。但服务器端的cronjob按照服务器时间执行它(按照服务器实例时间)。
例如我已将时间设定为下午3点,那么它应该在下午3点创建警报,但它会根据服务器时间9.00上午创建警报。这是时区问题,但我无法理解如何处理这种情况。客户端和服务器之间的时区差异?

在Settings.py

LANGUAGE_CODE = 'en-us' 

#TIME_ZONE = 'Asia/Kolkata' 
#TIME_ZONE = 'America/Chicago' 
TIME_ZONE = 'UTC' 

USE_I18N = True 

USE_L10N = True 

#USE_TZ = True 

我使用在客户端jquerydatetime选择器,它得到一个默认的系统时间。请提出一个方法,我该如何解决这个问题。

+0

你是否在使用芹菜作为玉米作物? – ruddra 2015-03-31 10:16:38

+0

@ruddra,芹菜怎么样? – MegaBytes 2015-03-31 10:20:23

+0

@ruddra,它应该考虑到它可以从任何地方设置,它基本上是针对美国地区,所以我设置时区UTC,我尝试过TIME_ZONE ='America/Chicago',但它没有解决 – MegaBytes 2015-03-31 10:27:24

回答

2

那么,一个解决方案可以使用JQuery并存储客户端的偏移量。例如,让我们在系统中的用户模型的字段:

class CustomUser(models.Model): 
    user = models.OneToOneField(User) 
    time_offset = models.DecimalField(default=Decimal('0.0'),max_digits=3, decimal_places=1) 

和(从这个SO答案参考)使Ajax请求UR自定义视图,并保存用户模型中该值。

$(document).ready(function(){ 
    var now = new Date() 
    var value = now.getTimezoneOffset() 

    $.ajax({ 
     url: "your-url", 
     type: "post", // or "get" 
     data: value, 
     success: function(data) { 

      console.log(data); 
     }}); 

}); 

# Ajax request view 

import json 
def post(request): 
    if request.POST(): 
     data = {} 
     try: 
     get_value= request.body 
     custom_user = CustomUser.objects.get(user=request.user) 
     custom_user.time_offset = get_value 
     custom_user.save() 
     data['success'] = 'Success' 
     return HttpResponse(json.dumps(data), content_type="application/json") 
     except Exception as e: 
     data['error'] = e 
     return HttpResponse(json.dumps(data), content_type="application/json") 

现在你有偏移量,所以当你运行你的玉米作业时,只需加/减时间偏移。

+1

在上面的解决方案中,您正在保存用户时间偏移量,并且每当cronjob执行时,它将获取用户偏移量并添加/减去时间偏移量,但它不适合我的示例,因为它不是用户特定的或区域具体。我试过这个,但它在创建问题的同时检查AM/PM的时间 – MegaBytes 2015-03-31 14:44:46

+1

你的时间被保存为日期对象,如'datetime.now()'?如果是这样,请使用'dateime.timedelta'将偏移量转换为timedelta对象,并从您的日期中减去它。 – ruddra 2015-03-31 15:20:49

+1

是的,你是对的,它可以使用timedelta来完成,但是cronjob呢,因为它按照系统时间运行,而在cronjob中,我正在检查最后五分钟的时间。 – MegaBytes 2015-03-31 15:34:51

相关问题