将 Linux 日期解析移植到 FreeBSD

将 Linux 日期解析移植到 FreeBSD

我有这种格式的日期:date -d $datum +"%Y-%m-%d"在 Linux 上它工作正常,但在 FreeBSD 中这样说:

ERROR wrong format
usage: date [-jnRu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... 
            [-f fmt date | [[[[[cc]yy]mm]dd]HH]MM[.ss]] [+format]

对此有何回应:

date -d $datum +"%Y-%m-%d" >/dev/null 2>&1 || echo "ERROR wrong format" 

但它打印出一个错误,然后继续执行代码,看起来是正确的。我应该做什么,这样它就不会打印出错误,如果有错误,程序就会退出?

答案1

我没有可供测试的 bsd 盒子,但看来您需要使用以下形式:

date -f "some format" "$datum" "+%Y-%m-%d"

并且您必须指定传入数据的格式,以便可以对其进行解析。

答案2

您在 Linux 上习惯使用的GNU 版本比大多数其他 Unix 变体上date的版本支持更多的日期格式。date它还具有许多其他 Unix 变体上没有的选项。唯一的标准的用法date是根据参数指定的格式显示当前日期+…(也是系统管理员设置系统日期的一种方式),以及-u指定 UTC 而不是本地时区的选项。

自由BSD,您可以使用该date实用程序通过选项在日期格式之间进行转换-f,例如,date -f %s "$datum" +%Y-%m-%d将以秒表示的日期从纪元转换为人类可读的格式。

如果您想要奇特的日期解析,您可以安装该coreutils软件包,其中包含 GNU 日期。或者您可以使用Date::ParsePerl 中的模块或dateutil在Python中。


要使 shell 脚本在大多数错误时停止,请添加set -e就在该#!线下方。

如果您想明确显示错误,则需要您以错误状态退出脚本。将错误打印到 stderr,而不是打印到 stdout。

date -d "$datum" +"%Y-%m-%d" >/dev/null 2>&1 || {
  echo "ERROR wrong format" >&2
  exit 1
}

或者

if ! date -d "$datum" +"%Y-%m-%d" >/dev/null 2>&1; then
  echo "ERROR wrong format" >&2
  exit 1
fi

相关内容