![尝试使用 %s 获取从纪元到当天的秒数,但日期无效](https://linux22.com/image/204780/%E5%B0%9D%E8%AF%95%E4%BD%BF%E7%94%A8%20%25s%20%E8%8E%B7%E5%8F%96%E4%BB%8E%E7%BA%AA%E5%85%83%E5%88%B0%E5%BD%93%E5%A4%A9%E7%9A%84%E7%A7%92%E6%95%B0%EF%BC%8C%E4%BD%86%E6%97%A5%E6%9C%9F%E6%97%A0%E6%95%88.png)
当我尝试运行以下命令时,我得到了正确的输出
date --date="04/1/2022 7:1:00" +'%s'
output: 1648776660
但是,当尝试使用不同的日期(2022 年 1 月 29 日)运行相同的命令时,它显示无效日期:
date --date="29/1/2022 7:1:00" +'%s'
error: date: invalid date ‘29/1/2022 7:1:00’
是因为第一部分要考虑一个月吗?这种情况怎么处理%s
?
因为它认为 29 号是一个月并且日期无效。有什么方法可以将 dd-mm-yyyy hh:mm:ss 转换为任何其他日期格式,以便我可以添加 %s 并获取秒数?请任何建议
答案1
(GNU) 的默认输入格式date
是电子邮件日期格式(请阅读RFC5322)。该格式最初定义于RFC-822作为dd mmm yy
。但mmm
表示 3 个字母(英文)月份名称。作为扩展,大多数date
程序也接受数字mm/dd/yyyy
(月份在前)。与 POSIX 日期中定义的类似:mmddhhmm[[cc]yy]
在 Ubuntu(您的操作系统)中,默认值date
是 GNU 日期,它需要这种mm/dd/yyy
格式。当前没有方法(GNU coreutils 8.32)来定义其他格式。
您可以使用-D
busybox 中可用的日期来解析通用格式:在 Ubuntu 中使用sudo apt-get install busybox
(after ) 安装 busybox。sudo apt-get update -y
$ busybox date -D '%d/%m/%Y %H:%M:%S' --date='04/1/2022 7:1:00'
Tue Jan 4 07:01:00 IST 2022
假设您在印度(IST 时间或 +5:30)。
当然,指定输出格式+'%s'
将为您提供自纪元以来的秒数。请注意,这将为您提供 IST 时间,而不是 UTC 时间。
$ busybox date -D '%d/%m/%Y %H:%M:%S' --date='04/1/2022 7:1:00 +0530' +'%s'
1641259860
$ date -ud @1641259860
Tue 04 Jan 2022 01:31:00 AM UTC
请注意时间有何不同!
对于其他人(不是在印度时间),可以通过以下方式重现结果:
$ TZ='Asia/Kolkata' busybox date -D '%d/%m/%Y %H:%M:%S' --date='04/1/2022 7:1:00' +'%s'
1641259860
在一些 BSD 日期实现中,我们可以使用-j
和-f
选项类似的结果。
$ date -j -f "%d/%m/%Y %T" "04/1/2022 7:1:00" +"%s"
1641259860
答案2
这与 无关+%s
。你确定date
可以解析dd/mm/yyyy
格式吗?
(手册页没有规定设置值LC_TIME
)。
在上面的纪元样本中
LC_TIME=C date -d@1648776660
Fri Apr 1 03:31:00 CEST 2022
你是1月4日还是4月1日测试的? (且时间与 7:1:00 不匹配)
我的猜测是,这29/1/2022
被解析为 2022 年 29 月的第一天。
编辑:确认使用--debug
选项
$ date --debug --date="29/01/2022 7:1:00" +'%s'
date: warning: value 29 has less than 4 digits. Assuming MM/DD/YY[YY]
date: parsed date part: (Y-M-D) 2022-29-01
date: parsed time part: 07:01:00
date: input timezone: system default
date: using specified time as starting value: '07:01:00'
date: error: invalid date/time value:
date: user provided time: '(Y-M-D) 2022-29-01 07:01:00'
date: normalized time: '(Y-M-D) 2024-05-01 07:01:00'
date: ---- --
date: possible reasons:
date: numeric values overflow;
date: missing timezone
date: invalid date ‘29/01/2022 7:1:00’