某个字段的夏娃日期时间格式

时间:2019-06-06 16:15:58

标签: eve

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()

1 个答案:

答案 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的不良做法,尤其是对于您计划在应用程序范围内使用的事情。

这是普遍接受的模式的原因是

  1. 它减少了易于人为错误的重复代码处理
  2. 对于将来的开发,它的工作量较少
  3. 它保持了MVC框架固有的“职责分离”

    例如,如果日期格式政策可能由于国际化而改变,那么您想要一个可以在一个位置(模型或控制器超类)而不是在1,000个视图实例中进行修改的解决方案