V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
dwjgwsm
V2EX  ›  问与答

日期的格式化问题

  •  
  •   dwjgwsm · 2018-03-07 16:05:10 +08:00 · 2490 次点击
    这是一个创建于 2460 天前的主题,其中的信息可能已经有所发展或是发生改变。

    from datetime import datetime t=datetime.now().date() #输出 2018-03-07 <class 'datetime.date'>

    现在我的问题是如何将这个日期类型的输出格式化为另一种格式,比如 20180307,但是依然为日期类型!网上没见到一个人说怎么转换,全是介绍 strptime strftime 的,问题在于 strftime 输出的是字符串类型,我要的是输出日期类型的 20180307,怎么办呢?

    16 条回复    2018-03-08 10:12:35 +08:00
    xgzxy
        1
    xgzxy  
       2018-03-07 16:11:11 +08:00
    import time

    data = time.strftime('%Y-%m-%d', time.localtime(time.time()))
    print data
    # 2018-03-07
    print ''.join(data.split('-'))
    # 20180307
    dwjgwsm
        2
    dwjgwsm  
    OP
       2018-03-07 16:25:25 +08:00
    我要的是日期类型的输出!
    xgzxy
        3
    xgzxy  
       2018-03-07 16:53:53 +08:00
    import time

    data = time.strftime('%Y-%m-%d-%H-%M-%S', time.localtime(time.time()))
    print data
    # 2018-03-07-16-52-38
    print ''.join(data.split('-'))
    # 20180307165238
    ysc3839
        4
    ysc3839  
       2018-03-07 16:54:52 +08:00
    "20180307" 就是字符串,"日期类型"在内存中是一段不可打印的数据,你要输出就必须转换成字符串。
    jackyzy823
        5
    jackyzy823  
       2018-03-07 17:06:49 +08:00   ❤️ 1
    subclass `datetime` 然后 override __str__ / __repr__
    dwjgwsm
        6
    dwjgwsm  
    OP
       2018-03-07 17:19:25 +08:00
    @ysc3839
    from datetime import datetime

    t=datetime.now().date()

    print(t)
    print(type(t)) #这个输出就是日期类型


    @jackyzy823 不太明白这个是怎么弄的,__str__并不能绕过格式转换问题吧,问题是怎么转换?
    ysc3839
        7
    ysc3839  
       2018-03-07 17:47:01 +08:00
    @dwjgwsm 你说的应该是 @jackyzy823 的这种方法。
    jackyzy823
        8
    jackyzy823  
       2018-03-07 18:14:09 +08:00 via Android
    print 的内部是调用 date 类的__str__方法… date 内置的格式是 %Y-%m-%d,所以你只能创建子类覆盖这个函数使用你的格式%Y%m%d。 如果你不强求,也可以使用 print(t.__format__("%Y%m%d"))
    dwjgwsm
        9
    dwjgwsm  
    OP
       2018-03-07 21:47:17 +08:00
    @jackyzy823 这个方法好!谢谢!
    dwjgwsm
        10
    dwjgwsm  
    OP
       2018-03-07 21:57:12 +08:00
    tt=t.__format__("%Y%m%d")
    print(type(tt)) #输出字符串
    看来 python 没有好的什么好办法了
    jackyzy823
        11
    jackyzy823  
       2018-03-07 23:54:15 +08:00
    @dwjgwsm
    ```
    class StrDate(date):
    def __str__(self):
    return self.__format__("%Y%m%d")

    t = StrDate.today()
    print(t)
    print(isinstance(t,date))
    ```
    geelaw
        12
    geelaw  
       2018-03-08 02:34:42 +08:00 via iPhone
    #10 和原本的内容里面,问题本身就是错误的。

    数据和数据的表示是两个概念,就像你不能说二进制的 10 和十进制的 2 是不同的整数,只不过 10 和 2 是同一个整数的不同表示。

    意思同 #4
    TigerS
        13
    TigerS  
       2018-03-08 05:04:25 +08:00
    @dwjgwsm
    > tt=t.__format__("%Y%m%d")
    > print(type(tt)) #输出字符串

    你对这个的理解不太对?
    当你 t=datetime.now().date() 的时候,print(t) 等同于 print(str(t))
    而 print(type(t)) 是 <type 'datetime.date'> 不代表 str(t) 是 date

    同理你上面的应该是
    tt = t
    print(tt.__format__("%Y%m%d")) 和 print(type(tt)) 的比较

    这里将原本的 str(t) 变换为 str(t)
    TigerS
        14
    TigerS  
       2018-03-08 05:05:11 +08:00
    @TigerS 笔误:这里将原本的 str(t) 变换为 t.__format__("%Y%m%d") 而已
    dwjgwsm
        16
    dwjgwsm  
    OP
       2018-03-08 10:12:35 +08:00
    明白了,谢谢各位!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2823 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 08:59 · PVG 16:59 · LAX 00:59 · JFK 03:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.