Python中如何处理时间问题

1. 调试如下代码,总是报错

搜索了一顿,好像还是没明白出错原因

2. CODE

# coding=utf-8
# python2.7

from datetime import datetime import re

t1= u"2018 年 01 月 1" t2= u"2018 年 02 月 22" t3= u"2018 年 3 月 37 日"

def str2digi(strin): m = re.match(u"(\d+)年(\d+)月(\d+)日?", strin)

yearn = m.group(1)
monthn = m.group(2)
dayn = m.group(3)


if len(m.group(2)) == 1:
    monthn = '0'+ monthn

if len(m.group(3)) == 1:
    dayn = '0' + dayn

cc = yearn + monthn + dayn
print 'firstdata is ',cc
print [cc]
ee = str(cc)
print [ee]

time = datetime.strptime(ee, "%Y%m%d").date()
return time

print ‘time is [%s]’ % str2digi(t1) print ‘time is [%s]’ % str2digi(t2) print ‘time is [%s]’ % str2digi(t3)

3. 输出

firstdata is  20180101
[u'20180101']
['20180101']
time is [2018-01-01]
firstdata is  20180222
[u'20180222']
['20180222']
time is [2018-02-22]
firstdata is  20180337
[u'20180337']
['20180337']
Traceback (most recent call last):
  File ".\t2.py", line 40, in <module>
    print 'time is [%s]' % str2digi(t3)
  File ".\t2.py", line 34, in str2digi
    time = datetime.strptime(ee, "%Y%m%d").date()
  File "C:\Python27\lib\_strptime.py", line 335, in _strptime
    data_string[found.end():])
ValueError: unconverted data remains: 7

Python中如何处理时间问题

9 回复

说明:t1 t2 t3 里没有空格,没有空格,这个是 V2EX 显示问题


Python处理时间主要用datetime模块,这是标准库里的核心工具。datetime类用来处理日期和时间,datetime类处理单独的日期或时间,timedelta计算时间差。

比如,获取当前时间:

from datetime import datetime
now = datetime.now()
print(now)  # 输出类似:2023-10-27 14:30:00.123456

解析字符串时间用strptime

date_str = "2023-10-27 14:30"
parsed_date = datetime.strptime(date_str, "%Y-%m-%d %H:%M")

格式化输出用strftime

formatted = now.strftime("%Y年%m月%d日 %H时%M分")

计算时间差:

from datetime import timedelta
future = now + timedelta(days=7, hours=3)
diff = future - now
print(diff.days)  # 相差天数

处理时区可以用pytz库(第三方):

import pytz
tz_shanghai = pytz.timezone('Asia/Shanghai')
local_time = datetime.now(tz_shanghai)

时间戳转换:

timestamp = now.timestamp()  # 转时间戳
from_timestamp = datetime.fromtimestamp(timestamp)  # 转回来

简单说就是:日常用datetime,复杂时区加pytz

3 月有 37 日?

哈哈,我就是试试,忘了这茬

我去,我真是晕了

话说回来,如果你真的确定你发帖的时候没有空格,可以 @ 一下 Livid,是不是 V2EX 自动给数字和中文之间加的空格,对 code block 也起作用了

如果你能保证都是中文的年月这种格式,我倒是有一个好办法

<br>import arrow<br><br>t1= u"2018 年 01 月 1"<br>t2= u"2018 年 02 月 22"<br>t3= u"2018 年 3 月 27 日"<br>tt = [t1,t2,t3]<br><br>date_format = ['YYYY 年 M 月 D','YYYY 年 M 月 DD','YYYY 年 MM 月 D','YYYY 年 MM 月 DD']<br><br>def format_date(raw_date):<br> for d in date_format:<br> try:<br> dt = arrow.get(raw_date,d).date()<br> # if you want str date with custom format<br> # dt = arrow.get(raw_date,d).format('YYYY-MM-DD')<br> print(f'time is [{dt}]')<br> break<br> except:<br> continue<br><br>for t in tt:<br> format_date(t)<br>

我去,果然是时间问题。

#2 难道不是 3 月就有 37 日😂

回到顶部