Posts pythonTip 75 百度时间
Post
Cancel

pythonTip 75 百度时间

题目描述: Baidu的服务器上使用的不是北京时间,而是Baidu时间。Baidu时间的时分秒与北京时间相同, 但是日期与北京时间不同,是用一个正整数表示从2000年1月1日开始经过了几天。现在就请大家设计一个程序将北京时间转换为百度时间。在本题中,闰年的年份是400的倍数,或者是4的倍数但不是100的倍数。比如2000和8888均为闰年,但6100不是。 现在给你一个字符串stime,表示待转化的北京时间(不含空格和TAB),正确的格式有两种:一种为:YYYY-MM-DD,(YYYY表示四位数年份,MM为两位月份,DD为两位日期); 另一种为:MM/DD/YYYY,(YYYY表示四位数年份,MM为两位月份,DD为两位日期);若给定的stime是正确的时间,则输出转换后的结果(一个整数); 否则输出Error。 如:stime=”2000-01-01”,则输出0 stime=”AStar2007”,则输出Error stime=”1999-12-31”,则输出-1

示例: 输入: stime = “2000-01-01” 输出: 0

分析: 因为这里有两种数据格式,所以我们需要一个专门的转换方式,对这两种格式的数据进行一个转换。首先要取到这三个日期,包括年月日,我用一个 nums 数组进行一个保存。

然后对这3个数字进行一个数据合法性的检查。

  1. 检查三个日期是否都是数字字符串。
  2. 检查年是不是 4 位数,月日是否为 2 位数。
  3. 判断年份是否在 [1, 9999] 之内,月份是否在 [1, 12], 日份是否在[1, 31]
  4. 然后对于闰年,在特殊判断2月份是否合理。

还需要一个判断闰年的函数,对上面日份判断进行一个合法性检查。

当我们得到了年月日,也做完了合法性检查,剩下的就是开始计算日期了,先算年份的,再算月份,再算日。要记得闰年的特殊判断。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
date_lst = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

def get_date(stime):
    nums = stime.split('-')
    if len(nums) != 3:
        nums = stime.split('/')
        if len(nums) != 3:
            return "Error"
        else:
            return [nums[2], nums[0], nums[1]]
    else:
        return nums

# 判断是否为 闰年
def is_leap_year(year):
    if not year % 400:
        return True
    
    if not year % 4 and year % 100:
        return True
    
    return False

def is_valid(nums):
    for value in nums:
        if not value.isdigit():
            return False
    
    if len(nums[0])  != 4 or len(nums[1]) != 2 or len(nums[2]) != 2:
        return False

    nums = [int(_) for _ in nums]

    # 判断年
    if nums[0] < 1 or nums[0] > 9999:
        return False

    # 检查月份
    if nums[1] < 1 or nums[1] > 12:
        return False

    # 检查 日期 
    if nums[2] < 1 or nums[2] > 31:
        return False


    # 对于闰年进行一个 特殊的判断
    if nums[1] == 2 and is_leap_year(nums[0]):
        if nums[2] > 29:
            return False
    else:
        if nums[2] > date_lst[nums[1]]:
            return False
    
    return True

nums = get_date(stime)
if nums != "Error":
    flag = is_valid(nums)
    if flag:
        nums = [int(_) for _ in nums]
        ans = 0
        # 计算 年份 部分
        for i in range(1, nums[0]):
            if is_leap_year(i):
                ans += 366
            else:
                ans += 365
        for i in range(1, nums[1]):
            if i == 2 and is_leap_year(nums[0]):
                ans += 29
            else:
                ans += date_lst[i]
        ans  += nums[2]

        print(ans-730120)

    else:
        print("Error")
else:
    print("Error")
This post is licensed under CC BY 4.0 by the author.
Trending Tags
Contents

pythonTip 74 C(n,k)

pythonTip 76 QQ音速

Trending Tags