我正在开发一个Web应用程序,后端是用Python编写的,而前端是用AngularJS编写的。我使用过Python和&之前的JavaScript,但在我需要两种语言进行交互的情况下却没有做很多。
在应用程序的其中一个页面上,有一个表单,用户可以使用该表单将数据从数据库导出到CSV文件 - 用户输入一些详细信息,指定他们想要使用的数据导出表格,然后按“导出”键。按钮生成&下载包含该信息的CSV文件。
数据库中的某些信息具有与之关联的时间值,我想实现在不同时区导出数据的功能。
在settings.py
文件中,在名为Production
的类中,有一个TIME_ZONE
变量设置为UTC
,所以所有的时间相关' Python后端记录在数据库中的数据将保存为UTC值。
数据库中记录的信息包括世界各地的数据,但目前看来所有这些信息都是参考UTC时间记录的,所以如果例如中国有人要输出数据在中国的网站,导出的信息仍将全部参考UTC时间。
我在“导出”表单中添加了一个字段,允许用户在导出数据时选择不同的时区,但由于数据全部以UTC格式记录,因此在导出时,它仍会显示时间字段的UTC值。
当用户点击“导出”时生成CSV文件的Python函数。是:
# This class provides the basis to implement the CSV output format
class CSVOutput(object):
# When the user asks for a download this file extension will be used
EXTENSION = 'csv'
# The internet media type for CSV files is specified by RFC 4180
HEADERS = [('Content-Type', 'text/csv; charset=UTF-8')]
# Specify a custom lexer for use with pygments (used for highlighting in
# the browsable API)
LEXER = CSVLexer
# This method is called to determine the headings given the object
def get_headings(self, obj):
raise NotImplementedError
# This method is called to prepare a row given the record
def format_row(self, record):
raise NotImplementedError
# This method takes a response and converts it to CSV format
def dumps(self, obj, **hints):
# Watch out for the user asking to convert a listing
if isinstance(obj, list):
raise ValueError('CSV output is only supported for instances')
# The response should usually be a ResponseWrapper instance
if not hasattr(obj, 'extra'):
raise ValueError('Object is missing the "extra" attribute')
# All log query responses should have a key for the records
if 'records' not in obj.extra:
raise ValueError('Response is missing the "records" key')
# In order to use the CSV writer we need a file-like object
data = StringIO()
# Create a CSV writer using the default dialect
writer = get_writer(data)
# The first line of the CSV always contains the headings
writer.writerow(self.get_headings(obj))
# All the other rows contain data (which we format first)
writer.writerows(map(self.format_row, obj.extra['records']))
# Pass back the headers, converted data and file extension
return self.HEADERS, data.getvalue(), self.EXTENSION
表单上的“导出”按钮的HTML是:
<div class="row">
<div class="col-sm-4"></div>
<div class="col-sm-4">
<button class="btn btn-sm btn-block btn-brand" ng-hide="!btnDisabled" ng-click="setDownloadUrl(true)">
<i class="ti-export"></i>
<span data-i18n="Export"></span>
</button>
<a class="btn btn-sm btn-block btn-brand" role="button" target="_blank" href="{{downloadURL}}" ng-hide="btnDisabled">
<i class="ti-export"></i>
<span data-i18n="Export"></span>
</a>
</div>
</div>
所以,我想知道的是,基于&#39;时区的价值&#39;在表单上的字段,我如何去添加/减去数据库中记录的时间值,以便导出文件中的时间值是他们导出的地方的本地值?
例如,如果有人要在英国的某个地方导出信息 - 我只需要在记录的UTC时间内加1,以便将其导出为BST值。如果他们要在北京的某个地方输出信息,我会在记录的UTC时间内加上8小时,以便按照北京当地的时间值输出。
修改
此问题与Getting the client's timezone in JavaScript不同,因为我不一定希望获得客户端本地的时区。我希望允许用户自行选择时区,可能是也可能不是本地时区。
通过设置此应用程序的Python后端的方式,所有时间值当前都以UTC格式记录,无论记录数据的站点的位置如何。
这意味着,目前,当用户想要导出数据时,无论该信息是针对欧洲,美国还是东南亚等,他们导出的任何时间值都将以UTC格式导出。
我想允许用户导出任何给定网站的信息,无论他们当前的位置如何,并且参考其当地时间显示该网站的信息 - 仅获取客户的本地时区当客户端位于要导出数据的站点时解决问题。