字段的前夕日期时间格式
Eve date time format for for a field
Python3.7::夏娃:
寻找一种方法来格式化域字段的日期时间而不是设置 global 日期时间格式?
我正在尝试存储 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:
"""
# 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()
将数据库字段保留为最不可知的格式通常是个好主意。
创建一个方法来处理转换细节。
如果您对每次需要输出日期时输入完整 date/time 转换的前景感到恼火,您可以在对象中创建一个方法,以您的方式处理转换喜欢。
这样一来,您就可以给它起一个容易记住的名字,从而省去记住日期/时间格式函数的确切符号的麻烦。
您甚至可以为您的对象创建一个 super-class,并在其中添加该方法,这样它就会被您希望具有此行为的所有对象继承。
因此,如果您将 BlogObject class 作为 super-class,并且 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
这样,当您从模板中调用函数时,模型或控制器已经对其进行了格式化。你应该避免在视图中做这种事情,因为这是不好的 MVC 实践,特别是对于你计划利用的东西 application-wide.
这是 generally-accepted 模式的原因是
它减少了容易出现人为错误的重复代码处理
为了以后的发展少work-intensive
它保持了 MVC 框架固有的“职责分离”
例如,如果日期格式政策发生变化,可能是由于国际化,那么您需要一个可以在一个位置(模型或控制器 super-class)而不是 1,000 个位置进行修改的解决方案查看实例
Python3.7::夏娃:
寻找一种方法来格式化域字段的日期时间而不是设置 global 日期时间格式?
我正在尝试存储 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:
"""
# 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()
将数据库字段保留为最不可知的格式通常是个好主意。
创建一个方法来处理转换细节。
如果您对每次需要输出日期时输入完整 date/time 转换的前景感到恼火,您可以在对象中创建一个方法,以您的方式处理转换喜欢。
这样一来,您就可以给它起一个容易记住的名字,从而省去记住日期/时间格式函数的确切符号的麻烦。
您甚至可以为您的对象创建一个 super-class,并在其中添加该方法,这样它就会被您希望具有此行为的所有对象继承。
因此,如果您将 BlogObject class 作为 super-class,并且 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
这样,当您从模板中调用函数时,模型或控制器已经对其进行了格式化。你应该避免在视图中做这种事情,因为这是不好的 MVC 实践,特别是对于你计划利用的东西 application-wide.
这是 generally-accepted 模式的原因是
它减少了容易出现人为错误的重复代码处理
为了以后的发展少work-intensive
它保持了 MVC 框架固有的“职责分离”
例如,如果日期格式政策发生变化,可能是由于国际化,那么您需要一个可以在一个位置(模型或控制器 super-class)而不是 1,000 个位置进行修改的解决方案查看实例