我正在使用coreutils 5.0运行AIX。我需要提前符合ISO-8601格式YYYY-MM-DD hh:mm:ss
的任意日期(或时间)。
例如:
D1
的值为:2017-07-08 19:20:01
,我需要添加30分钟。
在现代的UNIX系统中,我可能会写一些像
这样的东西date -d "$D1 + 30 minutes" +'%H:%M'
但是,唉,我需要它在旧的AIX上工作。
答案 0 :(得分:1)
尝试
$ date -d "$(date -d "$D1") + 30 minutes" +'%H:%M'
这适用于bash
,但不适用于ksh
。
对date
的内部调用会将D1
解析为日期,并以date
的“原生”格式显示。
$ date -d "$D1"
Sat Jul 8 19:20:01 CEST 2017
此输出将与+ 30 minutes
一起用于创建您想要的日期,并且外部到目前为止。
对date
的内部调用将会扩展,以便
$ date -d "$(date -d "$D1") + 30 minutes" +'%H:%M'
将等同于
$ date -d "Sat Jul 8 19:20:01 CEST 2017 + 30 minutes" +'%H:%M'
将是
19:50
答案 1 :(得分:0)
date -d @$(($(date -d "$D1" +%s) + 30 * 60)) +%H:%M
$(date -d "$D1" +%s)
回应时代$((epoch + value))
计算所需时间date -d@epoch +fmt
格式化答案 2 :(得分:0)
Awk解决方案:
awk -F '[-: ]' '{
ram=(mktime($1" "$2" "$3" "$4" "$5" "$6)+(30*60));
print strftime("%Y-%m-%d %T",ram)
}' <<< "$D1"
使用awk
的{{1}}功能将日期转换为日期字符串。添加30分钟(30 * 60),然后使用strftime将所需格式转换回日期字符串。
答案 3 :(得分:0)
如果从2003年开始运行AIX,那么我的朋友可能会陷入困境,但如果您只需要时间,而不是完整的日期,正如您的问题所暗示的那样,我认为@RamanSailopal得到了我们在那里的一半。
echo $D1 | awk -F "[: ]" '{
m = $3+30;
h = ($2+int(m/60)) % 24;
printf("%02i:%02i\n", h, m%60)
}'
awk
使用-F
参数中给出的拆分器模式将输入拆分到不同的字段中。该模式表示:
或空格。
输入将被分割为
$1 = 2017-07-08
$2 = 19
$3 = 20
$4 = 01
然后脚本计算假分钟值(可以大于或等于60)并将其存储在m
中。从该值计算小时,模24和实际分钟,m
模60.
如果你点击leap second,这可能会失败,所以如果你一直需要第二个精度,你应该使用其他方法。