题目描述: 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个数字进行一个数据合法性的检查。
- 检查三个日期是否都是数字字符串。
- 检查年是不是 4 位数,月日是否为 2 位数。
- 判断年份是否在 [1, 9999] 之内,月份是否在 [1, 12], 日份是否在[1, 31]
- 然后对于闰年,在特殊判断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")