第一章:The Missing Code Library--7.合法化日期格式

本文介绍了一个用于验证日期合法性的bash脚本,包括处理闰年规则及检查日期格式。通过脚本实现,我们可以高效地确认给定日期在现实世界中是否存在。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   所有的合法化输入脚本中,最有挑战的一个非属于操作日期不可。它的目的是确保一个给定的日期在现实中是存在的。如果忽略闰年,这个任务并不难,因为每年的日期都很有一致性。这种情况下,我们所要做的仅仅是将一个给定的日期和每个月的天数进行比较。但是为了计算闰年,就需要增加一些额外的逻辑了。      下面就是一个计算闰年的规则集合:
1.不能被4整除的不是闰年
2.能被4和400同时整除的是闰年
3.能被4整除,但不能被400整除,可又能被100整除的,不是闰年
4.除了上述情况,所有能被4整除的都是闰年

代码:

validdate.sh
 1 #!/bin/sh
 2 
 3 # validdate.sh--合法化一个日期,兼顾到闰年
 4 
 5 exceedsDaysinMonth()
 6 {
 7     # 给定一个月份,如果给定的天小于等于该月的最大天数,返回0
 8     # 否则,返回1
 9 
10     case $(echo $1 | tr '[:upper:]' '[:lower:]') in
11         jan* ) days=31;;  feb* ) days=28;;
12         mar* ) days=31;;  apr* ) days=30;; 
13         may* ) days=31;;  jun* ) days=30;; 
14         jul* ) days=31;;  aug* ) days=31;; 
15         sep* ) days=30;;  oct* ) days=31;; 
16         nov* ) days=30;;  dec* ) days=31;;
17         *) echo "$0: Unknown month name $1" >&2; exit 1
18     esac
19 
20     if [ $2 -lt 1 -o $2 -gt $days ]; then
21         return 1
22     else
23         return 0    # 天的数字合法
24     fi
25 }
26 
27 isLeepYear()
28 {
29     # 如果是闰年,函数返回0;否则,返回1
30     # 判断闰年的规则是:如上所述的4点
31 
32     year=$1
33 
34     if [ "$((year%4))" -ne 0 ]; then
35         return 1 
36     elif [ "$((year%400))" ]; then
37         return 0
38     elif [ "$((year%100))" ]; then
39         return 1
40     else
41         return 0
42     fi
43 }
44 
45 # 开始脚本的主要部分
46 
47 if [ $# -ne 3 ]; then
48     echo "用法: $0 月 日 年" >&2
49     echo "正确的输入格式是: August 3 1962和8 3 2002" >&2
50     exit 1
51 fi
52 
53 # 正常化日期,
54 
55 newdate="$(normdate.sh "$@")"
56 
57 if [ $? -eq 1 ]; then
58     exit 1         # normdate报告的错误状态
59 fi
60 
61 month="$(echo $newdate | cut -d\  -f1)"     # 注意,-d\后面到-f1之间有2个空格,反斜线\的作用是转义空格
62   day="$(echo $newdate | cut -d\  -f2)"
63  year="$(echo $newdate | cut -d\  -f3)"
64 
65 # 既然日期已经正常化了,那就测试下天数的值是否正确
66 
67 if ! exceedsDaysinMonth $month "$2"; then
68     if [ "$month" = "Feb" -a "$2" -eq "29" ]; then
69         if ! isLeepYear $3; then
70             echo "$0: $3 不是一个闰年,所以2月没有29天." >&2
71             exit 1
72         fi
73     else
74         echo "$0: 错误的天数: $month 没有 $2 天." >&2
75         exit 1
76     fi
77 fi
78 
79 echo "正确日期: $newdate"
80 
81 exit 0

运行脚本:
要运行脚本,只需要在命令行给出一个格式为“月 日 年”的日期。月可以是三个字母的缩写、完整月份或者是数字;但是年必须是一个4位的数字。

运行结果:

1 validdate.sh august 3 1960
2 正确日期: Aug 3 1960
3 validdate.sh 9 3 2001
4 正确日期: Sep 3 2001
5 validdate.sh feb 29 2004
6 正确日期: Feb 29 2004
7 ./validdate.sh feb 29 2006
8 ./validdate.sh: 2006 不是一个闰年¸所以2月没有29天.

分析脚本:
类似于这个脚本中的思路,我们也可以写一个合法化时间的脚步。时间的表示格式有:使用24小时制;使用am/pm后缀。在冒号处切割时间的值,确保分钟和秒数(如果有给出)在0-60之间,如果是am/pm的就再核实下第一个值是否在0-12之间,或者是24小时制的是否在0-24之间。(幸运的是,时间中有闰秒和其它细小的变动来保持日历的平衡,所以在日常的基础上我们完全可以忽略它们)

 

转载于:https://www.cnblogs.com/lalala23456/archive/2012/12/07/2806789.html

Traceback (most recent call last): File "D:\桌面\ultralytics-yolov8-main\test1\blueberry.py", line 4, in <module> a1 = YOLO('yolov8n.pt') # 官方提供的基础测试和训练模型 ^^^^^^^^^^^^^^^^^^ File "D:\桌面\ultralytics-yolov8-main\ultralytics\yolo\engine\model.py", line 106, in __init__ self._load(model, task) File "D:\桌面\ultralytics-yolov8-main\ultralytics\yolo\engine\model.py", line 145, in _load self.model, self.ckpt = attempt_load_one_weight(weights) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\桌面\ultralytics-yolov8-main\ultralytics\nn\tasks.py", line 396, in attempt_load_one_weight ckpt, weight = torch_safe_load(weight) # load ckpt ^^^^^^^^^^^^^^^^^^^^^^^ File "D:\桌面\ultralytics-yolov8-main\ultralytics\nn\tasks.py", line 336, in torch_safe_load return torch.load(file, map_location='cpu'), file # load ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\李佳伟\AppData\Roaming\Python\Python312\site-packages\torch\serialization.py", line 1524, in load raise pickle.UnpicklingError(_get_wo_message(str(e))) from None _pickle.UnpicklingError: Weights only load failed. This file can still be loaded, to do so you have two options, do those steps only if you trust the source of the checkpoint. (1) In PyTorch 2.6, we changed the default value of the `weights_only` argument in `torch.load` from `False` to `True`. Re-running `torch.load` with `weights_only` set to `False` will likely succeed, but it can result in arbitrary code execution. Do it only if you got the file from a trusted source. (2) Alternatively, to load with `weights_only=True` please check the recommended steps in the following error message. WeightsUnpickler error: Unsupported global: GLOBAL ultralytics.nn.tasks.DetectionModel was not an allowed global by default. Please use `torch.serialization.add_safe_globals([ultralytics.nn.tasks.DetectionModel])` or the `torch.serialization.safe_globals([ultralytics.nn.tasks.DetectionModel])` context manager to allowlist this global if you trust this class/function. Check the documentation of torch.load to learn more about types accepted by default with weights_only https://pytorch.org/docs/stable/generated/torch.load.html.解释代码
最新发布
05-23
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值