如何在unix中将字符串设置为时间戳?

时间:2017-01-28 06:36:06

标签: shell date unix timestamp

我在unix脚本中有一个String变量,其数据类似于' 2017010110' (格式类似于 - %Y%m%d%H)。请注意,它不是系统时间戳。

现在我需要从2017010110减去-1小时。表示输出应为2017010109。我尝试从变量中减去1。

但是当输入是2017010100时,很明显我输出错误2017010099(预期输出为2016123123)。

似乎我必须将我的String变量设置为unix中的时间戳,以使此减法发生1小时。

我提到Convert date time string to UNIX timestamp in bash command但是找不到运气。

有人可以帮我吗?

1 个答案:

答案 0 :(得分:1)

看看下面的代码:

#!/bin/bash
ts="2017010100"
d="[0-9]"
if
  [[ "$ts" =~ ($d$d$d$d)($d$d)($d$d)($d$d) ]]
then
  year="${BASH_REMATCH[1]}"
  month="${BASH_REMATCH[2]}"
  day="${BASH_REMATCH[3]}"
  hour="${BASH_REMATCH[4]}"
  timezone=EST
  adjusted_ts="$(date -d "$year-$month-$day $hour:00:00 $timezone - 1 hour" "+%Y%m%d%H")"
  echo "$adjusted_ts"
else
  echo "Invalid timestamp"
fi

此代码将您的时间戳拆分为单个字段,以其理解的时间格式提供GNU date并删除一小时,并将变量设置为此date命令的输出。代码是特定于Bash的(使用Bash正则表达式匹配),但它为您提供了一般概念。

请注意我被迫指定了一个时区,否则(至少在我的系统上)存在某种偏移(可能与UTC相关)会导致结果混乱。我还没有找到一种方法来指定某种“LOCAL”时区,以避免必须将系统时区嵌入刺痛中。我非常感谢任何改进此建议并使代码与时区无关的建议。