尝试使用 %s 获取从纪元到当天的秒数,但日期无效

尝试使用 %s 获取从纪元到当天的秒数,但日期无效

当我尝试运行以下命令时,我得到了正确的输出

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)来定义其他格式。

您可以使用-Dbusybox 中可用的日期来解析通用格式:在 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’

相关内容