如何让 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 年以来,您可以使用这-p
strptime
在命令行上传递-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&Tksh93
也printf %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
答案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
IFS='/' read d m y <<<09/07/2016 ; echo "$m/$d/$y"
sed -r 's|([^/]*)/([^/]*)|\2/\1|' <<<09/07/2016
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"