Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 如何在unix中将字符串设置为时间戳?_Shell_Date_Unix_Timestamp - Fatal编程技术网

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

Shell 如何在unix中将字符串设置为时间戳?,shell,date,unix,timestamp,Shell,Date,Unix,Timestamp,我在unix脚本中有一个字符串变量,其数据类似于“2017010110”(格式类似于--%Y%m%d%H)。请注意,它不是系统时间戳 现在我需要从2017010110中减去-1小时。表示输出应为2017010109。我试着从变量中减去1 但是当输入为2017010100时,很明显我会得到错误的输出2017010099(预期输出为2016123123) 似乎我必须在unix中将字符串变量设置为timestamp才能实现1小时的减法 我提到了,但没有找到任何运气 有人能帮我一下吗 看看下面的代码:

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

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

但是当输入为2017010100时,很明显我会得到错误的输出
2017010099
(预期输出为
2016123123

似乎我必须在unix中将字符串变量设置为timestamp才能实现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理解的时间格式提供GNU
date
,并删除一个小时,并为此
date
命令的输出设置一个变量。代码是特定于Bash的(使用Bash正则表达式匹配),但它提供了一个总体概念


请注意,我被迫指定了一个时区,否则(至少在我的系统上)会有某种偏移量(可能与UTC有关)将结果弄乱。我还没有找到一种方法来指定某种“本地”时区,以避免在sting中嵌入系统时区。我非常感谢您提出任何改进建议,使代码时区独立。

您有
GNU日期
还是
FreeBSD日期
?您好。GNU日期可用。但我不知道如何将字符串变量设置为减法1小时的日期格式。