【发布时间】:2017-08-14 09:14:17
【问题描述】:
我有一个数值 N1 = 20170708192012,并想转换为日期
就像是 :
D1=echo $N1 | date -d '+%Y%m%d%H%M%S'
回声$D1
转换后添加 40 分钟以获取新日期。
【问题讨论】:
-
date无法解析该格式的日期。awk是可接受的选项吗? -
@randomir ,是的,可以选择 awk
我有一个数值 N1 = 20170708192012,并想转换为日期
就像是 :
D1=echo $N1 | date -d '+%Y%m%d%H%M%S'
回声$D1
转换后添加 40 分钟以获取新日期。
【问题讨论】:
date 无法解析该格式的日期。 awk 是可接受的选项吗?
您需要在将字符串传递给日期之前对其进行解析,因此:
N1=$(awk '{ print substr($0,1,8)" "substr($0,9,2)":"substr($0,11,2)":"substr($0,13,2)}' <<< 20170708192012)
使用 awk 和 substr 函数以日期可接受的格式构建 N1。
【讨论】:
如果您的 awk 支持 time functions mktime 和 strftime(这是 GNU 扩展),您可以先将输入字符串转换为 Unix 时间戳(通过手动拆分和使用 mktime),然后然后用strftime格式化输出:
N1=20170708192012
D1=$(awk '{ print strftime("%Y%m%d%H%M%S", mktime(substr($0,1,4)" "substr($0,5,2)" "substr($0,7,2)" "substr($0,9,2)" "(substr($0,11,2)+40)" "substr($0,13,2))) }' <<<"$N1")
注意mktime 只接受"YYYY MM DD HH MM SS" 格式的日期,这就是我们需要手动构造它的原因。但是它会自动进行标准化,它会很高兴地将"2017 1 1 0 80 0" 转换为与"2017 1 1 1 20 0" 相同的时间戳。这就是为什么我们可以简单地将40 添加到输入的分钟数并获得正确的输出。
根据您的意见,我们得到:
echo $D1
20170708200012
【讨论】: