Python:在不使用内置函数或库的情况下比较日期字符串

Python:在不使用内置函数或库的情况下比较日期字符串,python,string,date,Python,String,Date,我想知道我们是否可以比较Python中的两个日期字符串,而不使用Python或库中的任何内置函数。 例如: 2017年1月25日>2017年12月12日 这实际上是假的,但它返回真的。 提前感谢。如果日期字符串的格式符合字典顺序(字母顺序),例如:“yyyyymmdd”或“yyyy/mm/dd”,则可以 例如: d1 = "20170101" d2 = "20170102" print (d2 > d1) # True print (d2 < d1) # False print (

我想知道我们是否可以比较Python中的两个日期字符串,而不使用Python或库中的任何内置函数。 例如: 2017年1月25日>2017年12月12日

这实际上是假的,但它返回真的。
提前感谢。

如果日期字符串的格式符合字典顺序(字母顺序),例如:“yyyyymmdd”或“yyyy/mm/dd”,则可以

例如:

d1 = "20170101"
d2 = "20170102"

print (d2 > d1) # True
print (d2 < d1) # False
print (d2 == d1) # False

如果给定的日期严格采用该格式,则可以将字符串解析为该格式

def compare(dateOne, dateTwo):
    #Break up the date into its components
    day = int(dateOne[0:2])
    month = int(dateOne[3:5])
    year = int(dateOne[6:10]))

    dayTwo = int(dateTwo[0:2])
    monthTwo = int(dateTwo[3:5])
    yearTwo = int(dateTwo[6:10]))

    #Compare the years first
    if(year > yearTwo):
        return True
    elif(year < yearTwo):
        return False
    else:
        #If the years are equal, then compare the months
        if(month > monthTwo):
            return True
        elif(month < monthTwo):
            return False
        else:
            #If the days are equal, return False since it's strictly greater, else, return the appropriate value. 
            if(day > dayTwo):
                return True
            else:
                return False

它将是
False
。此函数用于比较左操作数日期是否大于右操作数日期

您可以这样做:

def compare(d1, d2):
    for x, y in list(zip(map(int, d1.split('/')), map(int, d2.split('/'))))[::-1]:
        if x != y:
            return x > y
它从年份开始,如果两个年份相等,我们就转到月份。如果两个月都相等,那么我们就开始新的一天。如果date1的月/年/日大于date2的月/年/日,则返回
True
并立即退出循环

或者,使用
all
将其设为一行

def compare(d1, d2):
    return all(x > y for x, y in list(zip(map(int, d1.split('/')), map(int, d2.split('/'))))[::-1])
这确实使用了
map
功能。如果出于某种原因您不想使用,可以这样做:

def compare(date1, date2):
    date1_parts = date1.split('/')
    d1, m1, y1 = int(date1_parts[0]), int(date1_parts[1]), int(date1_parts[2])

    date2_parts = date2.split('/')
    d2, m2, y2 = int(date2_parts[0]), int(date2_parts[1]), int(date2_parts[2])

    return (y1, m1, d1) > (y2, m2, d2)

现在它仍然使用
str.split
int
(不是真正的内置函数,但不清楚约束是什么)。你可以继续尝试消除其中一些,但我就到此为止:)

除非是学校作业,否则你不应该尝试“不使用内置函数或库”。如果是这样的话,你必须知道在哪一点上你不能使用“内置函数”——因为正确的比较包括拆分日、月和年的组成部分,或者将它们转换成整数,或者以一种实际可比较的方式重新分配日期字符串——但所有这些都需要一对“内置函数”“但结果是真的。”那么你已经开始了?你介意告诉我们你已经有了什么吗?这样我们就可以更容易地告诉你你做错了什么,而不是自己重新写吗?这是学校作业吗?不要让stackoverflow做作业,除非OP的那一年是最后一年。@Corymaden我想你漏掉了单词”例如,“在问题中OP使用的示例日期之前;)不错。但是有很多内置函数。如果OP可以使用它们,它们也可以使用时间模块。
zip
map
int
split
都是“内置的”“我想是函数。那么,一切都是内置函数。我假设这意味着没有导入。你可以在if语句中使用一个分支,然后说
if x!=y:返回x>y
。啊,很好。这比我的要漂亮得多。请注意,您可以使用元组比较,而不是这三个嵌套的if语句。
def compare(d1, d2):
    return all(x > y for x, y in list(zip(map(int, d1.split('/')), map(int, d2.split('/'))))[::-1])
def compare(date1, date2):
    d1, m1, y1 = map(int, date1.split('/'))
    d2, m2, y2 = map(int, date2.split('/'))

    return (y1, m1, d1) > (y2, m2, d2)
def compare(date1, date2):
    date1_parts = date1.split('/')
    d1, m1, y1 = int(date1_parts[0]), int(date1_parts[1]), int(date1_parts[2])

    date2_parts = date2.split('/')
    d2, m2, y2 = int(date2_parts[0]), int(date2_parts[1]), int(date2_parts[2])

    return (y1, m1, d1) > (y2, m2, d2)