【问题标题】:converting month number to date using KornShell使用 KornShell 将月份数字转换为日期
【发布时间】:2013-11-26 01:18:42
【问题描述】:

我正在尝试将月份编号转换为名称,但它给出的输出是当前月份,而不是变量中给出的日期。

KornShell (ksh) 代码:

datep= 2013-10-22
echo $datep |printf "%(%B)T\n"

【问题讨论】:

  • 等号后面不允许有(不带引号的)空格:使用datep=2013-10-22

标签: shell date unix scripting ksh


【解决方案1】:

printf 不从标准输入读取,因此它假设今天的日期作为%T 格式的默认参数;您需要提供日期作为参数。

printf "%(%B)T\n" "$datep"

【讨论】:

  • export month_end_date=tail -1 month_end_dt.txt export month=printf "%(%B)T\n" "$month_end_date" 我在month_end_dt.txt 文件中有一个日期,并将日期分配给month_end_date 参数。我想将其作为全局变量,它将在许多脚本中使用,因此将月份名称导出到变量 month 我收到错误 main.ksh[7]: export: %(%B)T\n: is not一个标识符
  • 你需要先捕获printf的输出:export WHATEVER=$(printf "%(%B)T\n" "$datep")
【解决方案2】:

这样做:

$ datep="2013-10-22"
$ date -d"$datep" "+%B"
October

根据man date

-d, --date=STRING

显示时间由 STRING 描述,而不是“现在”

所以我们得到:

$ date -d"$datep"
Tue Oct 22 00:00:00 CEST 2013

那你说你想要%B,也就是来自man date

%B

语言环境的完整月份名称(例如,一月)

所以只需要使用字符串末尾的格式即可。

其他例子:

$ date -d"$datep" "+%Y" #year
2013
$ date -d"$datep" "+%F" #date
2013-10-22
$ date -d"$datep" "+%T" #time (if not given, gets the default)
00:00:00

【讨论】:

  • 谢谢你的回答,你能简单解释一下它是如何工作的
  • 嗯,有趣的@chepner。我想我应该在我的机器上安装ksh 来做一些测试。
  • 我喜欢把它想象成被遗忘的外壳 :)。它有一些功能还没有被bash(甚至zsh,令人惊讶地)采用。
  • export month_end_date=tail -1 month_end_dt.txt export month=printf "%(%B)T\n" "$month_end_date" 我在month_end_dt.txt 文件中有一个日期,并将日期分配给month_end_date 参数。我想将其作为全局变量,它将在许多脚本中使用,因此将月份名称导出到变量 month 我收到错误 main.ksh[7]: export: %(%B)T\n: is not一个标识符
  • @user2014896 评估命令,执行var=$(command)。在您的情况下,end_date=$(tail -1 ...)。至于其余的,最好更新答案或提出新的答案。在 cmets 中很难检查代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-02
  • 1970-01-01
  • 1970-01-01
  • 2018-12-24
相关资源
最近更新 更多