首页 文章

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

提问于
浏览
0

我在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 回答

  • 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”时区,以避免必须将系统时区嵌入刺痛中 . 我将非常感谢任何改进此建议并使代码与时区无关的建议 .

相关问题