Python:比较日期字符串而不使用内置函数或库

时间:2017-08-13 03:38:46

标签: python string date

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

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

4 个答案:

答案 0 :(得分: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)

这确实使用了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.splitint(不是真正的内置函数,但不清楚你的约束是什么)。你可以继续试图消除其中的一些,但我会停在那里:)

答案 1 :(得分:0)

是的,如果日期字符串的格式符合字典顺序(字母顺序),例如:" yyyymmdd"或" yyyy / mm / dd"。

示例:

d1 = "20170101"
d2 = "20170102"

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

<强>更新

如果你想比较具有相同格式的字符串,我们可以通过使用元组比较来改善Miket的答案:

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

    return (year, month, day) > (yearTwo, monthTwo, dayTwo)

答案 2 :(得分:0)

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

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

给出值

compare("25/01/2017","12/12/2017")

这将是False。此函数比较左操作数日期以查看它是否大于右操作数日期。

答案 3 :(得分:0)

你可以这样做:

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