强制日期读取日/月/年

强制日期读取日/月/年

如何让 GNUdate命令以“dd/mm/yyyy”格式解释日期,例如:

我得到什么:

$ date  -d '09/07/2016'
Wed, Sep  7, 2016 12:00:00 AM

我想要的是:

$ date  -d '09/07/2016'
Sat, Jul  9, 2016 12:00:00 AM

我尝试过设置LC_ALL但没有成功。

答案1

请注意,这date -d是一个 GNU 扩展。它期望的语法是固定的并且独立于语言环境。特别是,它确实不是使用POSIXgetdate()解析日期(尽管 GNU 使用的接口也date曾经被调用过)。getdate()

busybox 某些版本的某些构建也可以识别-d选项,但支持的格式范围较窄。特别是,它不识别mm/dd/YYYY.但是,您可以传递一个-D <strptime-format>选项(感谢@BinaryZebra)来指定您喜欢的格式:

$ date -D %d/%m/%Y -d 01/10/2016
Sat Oct  1 00:00:00 BST 2016

美国电话电报公司(ast-open) date,自 1995 年以来,还支持 GNU 风格的-d选项。那一个确实使用 POSIX getdate()。因此,通过该date实现,您可以使用DATEMSK变量来更改日期解析方式,并且自 1996 年以来,您可以使用-pstrptime在命令行上传递-style 解析格式:

$ date --version
  version         date (AT&T Research) 2011-01-27
$ date -d 01/10/2016
Sun Jan 10 13:36:39 GMT 2016
$ date -d 01/10/2016 -p %d/%m/%Y
Sat Oct  1 13:36:51 BST 2016

AT&Tksh93printf %T使用getdate()兼容的 API,因此也可能受到该DATEMSK变量的影响,因此在 ksh93 中,您可以执行以下操作:

$ DATEMSK=/dev/stdin <<< %d/%m/%Y printf '%T\n' 01/10/2016
Sat Oct  1 13:47:06 BST 2016

要在脚本中可移植地解析日期zsh,您可以使用strftime内置函数(加载后)和-r选项:

$ zmodload zsh/datetime
$ strftime -s REPLY -r '%d/%m/%Y' 09/07/2016
$ strftime %c $REPLY
Sat 09 Jul 2016 00:00:00 BST

zsh'sstrftime -r使用 POSIXstrptime()来解析字符串。因此,它依赖于区域设置。例如,在法语语言环境中,您可以使用它strftime -r %d-%b-%Y 14-juillet-2016来解析法语日期。

某些strptime()实现(例如 GNU 的实现)在非英语语言环境中仍然接受英文月/日名称,但并非全部(例如 Solaris 11 的实现就不会)。在用户区域设置中解析英语日期时需要记住一些事情。

最新版本bash也有 ksh 风格printf '%(format)T',但没有时间解析功能。

为了完整起见,在 BSD 上,date接受-f <strptime-format>,您可以结合使用它来-j重新格式化日期:

$ date -jf %d/%m/%Y 01/10/2016
Sat Oct  1 13:47:06 BST 2016

答案2

使用 busybox date 似乎是正确的选择:

$ busybox date -uD '%d/%m/%Y' -d '09/07/2016'
Sat Jul  9 00:00:00 UTC 2016

这是可行的,因为 busybox date 接受一个 format( -D) 来读取里面的日期-d

为了使命令更可靠并准确构建您要求的格式:

$ LC_ALL=C busybox date -uD '%d/%m/%Y' -d '09/07/2016' +'%a, %b %d, %Y %r'
Sat, Jul 09, 2016 12:00:00 AM

Busybox 日期命令

答案3

info date

YEAR-MONTH-DAY对于数字月份,允许使用ISO 8601 格式。
当月份按字面书写时,日历日期可以采用以下任意一种形式:

 DAY MONTH YEAR
 DAY MONTH
 MONTH DAY YEAR
 DAY-MONTH-YEAR

所以主要规则

所有这些字符串都指定相同的日历日期:

 1972-09-24     # ISO 8601.
 72-9-24        # Assume 19xx for 69 through 99,
                # 20xx for 00 through 68.
 72-09-24       # Leading zeros are ignored.
 9/24/72        # Common U.S. writing.
 24 September 1972
 24 Sept 72     # September has a special abbreviation.
 24 Sep 72      # Three-letter abbreviations always allowed.
 Sep 24, 1972
 24-sep-72
 24sep72

在这种情况下,您可以使用月份的文字名称或在将其提供给之前重建日期字符串date

  1. IFS='/' read d m y <<<09/07/2016 ; echo "$m/$d/$y"
  2. sed -r 's|([^/]*)/([^/]*)|\2/\1|' <<<09/07/2016
  3. tr '/' '\n' <<<09/07/2016 | tac | tr '\n' '-' ……

答案4

使用格式选项:

date -d `date -d '09/07/2016' +"%d/%m/%Y"` +"%a, %b %-d, %Y 12:00:00 AM"

相关内容