Python3.7 ::夏娃:
正在寻找一种格式化域字段日期时间的方法,而不是设置全局日期时间格式?
我正在尝试存储yyyy-mm-dd
格式,但是我不想更改_created
和_update
的工作方式。我最好只存储字符串并处理日期转换作为前端渲染的一部分吗?
-编辑- 像这样使用验证器会很昂贵吗?
import datetime
from dateutil.parser import parse
from eve.io.mongo import Validator
class MyValidator(Validator):
"""
Extend / override the built-in validation rules
"""
def _validate_is_yyyymmdd(self, is_yyyymmdd, field, value):
"""datetime format yyyy-mm-dd"""
print(is_yyyymmdd, field, value)
print(datetime.datetime.strptime(value, r'%Y-%m-%d'))
print(is_yyyymmdd and datetime.datetime.strptime(value, r'%Y-%m-%d'))
try:
if is_yyyymmdd and datetime.datetime.strptime(value, r'%Y-%m-%d'):
return
except:
self._error(field, "Value is not valid yyyy-mm-dd")
volumes.py
volumes = {
'schema':{
'record_date':{
'type':'string',
'is_yyyymmdd':True,
},
'volume_gallons':{'type':'float'},
}
已解决 - 更新
DATE_FORMAT = r"%Y-%m-%dT%H:%M:%S.%f%Z%z"
使用新的日期格式,可以通过时区调整提交有效载荷,然后将其作为UTC存储在mongo中。
{
"record_date":"2019-04-06T15:49:12.012UTC+0500",
"group":"horizontal",
"program_year":2016
}
python脚本,可帮助在给定时间内转换为utc
from datetime import datetime
from dateutil import tz
from dateutil.parser import parse
def main():
"""
modified solution found here: https://stackoverflow.com/questions/4770297/convert-utc-datetime-string-to-local-datetime
"""
# set the time zones to convert from and to
# https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
from_zone = tz.gettz('America/Denver')
to_zone = tz.tzutc()
# This is the format SQL Server outputs date time
datetime_str = "2019-03-21 02:37:21"
# local = datetime.strptime(datetime_str, '%Y-%m-%d %H:%M:%S')
local = parse(datetime_str)
# Tell the datetime object that it's in local time zone since
# datetime objects are 'naive' by default
local = local.replace(tzinfo=from_zone)
# Convert time zone
utc = local.astimezone(to_zone)
print(utc, local)
if __name__ == "__main__":
main()
答案 0 :(得分:0)
通常最好将数据库字段保留为最不可知的格式。
创建一种方法来处理转换详细信息。
如果每次需要输出日期时都讨厌输入完整的日期/时间转换,您可以在对象中创建一个方法,以自己喜欢的方式处理转换。
>这样,您可以为它起一个易于记忆的名称,并且省去了记住日期/时间格式功能确切符号的麻烦。
您甚至可以为您的对象创建一个超类,然后在其中添加方法,以便所有您希望使该行为可用的对象都可以继承该方法。
因此,如果您具有BlogObject类作为超类,并且BlogPost继承自BlogObject,并且您正在访问所有这些对象中都存在的标准字段,例如创建日期或修改日期,则
class BlogObject(BaseClassName):
def pretty_create_dt():
self.beatify_date(self.update_dt)
def beautify_date(date):
#[your format code]
#then have the other class(es) inherit the method:
class BlogPost(BlogObject):
def get_xmas_date_before(days_before_xmas):
date_x_before_christmas = self.beautify_date(self.xmas_dt - days_before_xmas)
#pseudo-code-ish, just to get the point across
这样,当您从模板调用函数时,该函数已经由模型或控制器格式化。您应该避免在View中执行此类操作,因为这是MVC的不良做法,尤其是对于您计划在应用程序范围内使用的事情。
这是普遍接受的模式的原因是
它保持了MVC框架固有的“职责分离”
例如,如果日期格式政策可能由于国际化而改变,那么您想要一个可以在一个位置(模型或控制器超类)而不是在1,000个视图实例中进行修改的解决方案