【发布时间】:2021-07-04 17:48:25
【问题描述】:
我正在尝试计算当前日期与给定(部分已知)日期之间的差异。例如:下面列出了有效的日期格式 (YYYY-MM-DD)。
YYYY-MM-DD
YYYY-MM-??
YYYY-??-??
????-??-??
例如,对于当天 (2021-07-04),结果将是
2021-12-02 -> 0 years, 5 months, however many days.
2022-06-?? -> 1 year, however many months
2077-??-?? -> ~56 Years
????-??-?? -> Unknown
所以基本上,当有 ?? 时,该部分被忽略,我们只检查日期的下一个较高部分,例如如果这一天标有 ??我们只看年份和月份等。
到目前为止,这是我汇总的内容:
@staticmethod
def calculate_time_left(release_date):
# Only year is known:
if re.match("([0-9]{4})-\?\?-\?\?", release_date):
release_year = int(re.search("([0-9]{4})-\?\?-\?\?", release_date).group(1))
current_year = int(datetime.datetime.now().year)
if release_year == current_year:
return "This year."
else:
return "~{} year(s).".format(release_year - current_year)
elif re.match("([0-9]{4})-([0-9]{2})-\?\?", release_date):
release_year = int(re.search("([0-9]{4})-([0-9]{2})-\?\?", release_date).group(1))
current_year = int(datetime.datetime.now().year)
release_month = int(re.search("([0-9]{4})-([0-9]{2})-\?\?", release_date).group(2))
current_month = int(datetime.datetime.now().month)
if release_year == current_year:
if release_month == current_month:
return "This month"
else:
return "~{} months".format(release_month - current_month)
else:
return "{} year(s) and {} months.".format(release_year - current_year, release_month - current_month)
elif re.match("([0-9]{4})-([0-9]{2})-([0-9]{2})", release_date):
release_year = int(re.search("([0-9]{4})-([0-9]{2})-([0-9]{2})", release_date).group(1))
current_year = int(datetime.datetime.now().year)
release_month = int(re.search("([0-9]{4})-([0-9]{2})-([0-9]{2})", release_date).group(2))
current_month = int(datetime.datetime.now().month)
release_day = int(re.search("([0-9]{4})-([0-9]{2})-([0-9]{2})", release_date).group(3))
current_day = int(datetime.datetime.now().day)
if release_year == current_year:
if release_month == current_month:
if release_day == current_day:
return "Today."
else:
return "{} days.".format(release_day - current_day)
else:
if release_day == current_day:
"~{} months.".format(release_month - current_month)
else:
return "~{} months and {} days.".format(release_month - current_month, release_day - current_day)
else:
if release_month == current_month:
if release_day == current_day:
return "{} year(s).".format(release_year - current_year)
else:
if release_day == current_day:
return "{} year(s) and {} months.".format(release_year - current_year, release_month - current_month)
else:
return "{} year(s), {} months and {} days.".format(release_year - current_year, release_month - current_month, release_day - current_day)
return "Release date unknown."
我在这里遇到了几个问题:
- 我得到了月份和日期差异的负值。例如
2022-01-02将返回1 year(s), -6 months and -2 days。 - 我觉得我不需要为每种情况都进行所有这些正则表达式匹配。可能有更好的方法来做到这一点。
我该如何正确解决这个问题?我觉得我的方法很差,而且容易出错。
【问题讨论】:
标签: python regex date datetime substring