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
使用Bash Shell脚本从时间戳获取格式化日期_Bash_Date_Timestamp - Fatal编程技术网

使用Bash Shell脚本从时间戳获取格式化日期

使用Bash Shell脚本从时间戳获取格式化日期,bash,date,timestamp,Bash,Date,Timestamp,我需要一个特定格式的日期,但我不知道怎么做 这是我目前的约会方式 date -r "$timestamp" +'%Y-%m-%dT%H:%M:%S.s' 但是问题是毫秒的位数对于我需要的格式来说太多了。我需要将毫秒限制为3位数 你知道我怎么能做这样的事吗 当前解决方案 不准确,但它是有效的。我随后计算毫秒数,然后只取字符串的前三个字符。显然,这并没有考虑到汇总 date_string_one=`date -r "$timestamp" +'%Y-%m-%dT%H:%M:%S.'` date_s

我需要一个特定格式的日期,但我不知道怎么做

这是我目前的约会方式

date -r "$timestamp" +'%Y-%m-%dT%H:%M:%S.s'
但是问题是毫秒的位数对于我需要的格式来说太多了。我需要将毫秒限制为3位数

你知道我怎么能做这样的事吗

当前解决方案

不准确,但它是有效的。我随后计算毫秒数,然后只取字符串的前三个字符。显然,这并没有考虑到汇总

date_string_one=`date -r "$timestamp" +'%Y-%m-%dT%H:%M:%S.'`
date_string_milli=`date -r "$timestamp" +'%s'`
date_string="$date_string_one"`printf "%.3s" "$date_string_milli"`

有一百万种方法可以做到这一点。。一个简单的方法是删除尾随数字

date +'%Y-%m-%d %H:%M:%S.%N' | sed 's/[0-9][0-9][0-9][0-9][0-9][0-9]$//g'


一个问题:
%s
不是毫秒的日期格式,而是当前历元的秒数。 %N表示纳秒,我不知道GNU date的指定日期格式是毫秒


请尝试
date--help
查看所有格式选项。

如果没有几个步骤,就想不出一种方法,但这将使您达到以下目的:

d=$(date +'%Y-%m-%d %H:%M:%S|%N')
ms=$(( ${d#*|}/1000000 ))
d="${d%|*}.$ms"
echo $d

2013-04-16 08:51:48.874

由于到目前为止,所有组件都是从单个调用中提取的,因此它们将保持一致。

使用
printf
进行实际格式化;使用
date
生成参数集
printf
需要填充格式字符串

printf '%04d-%02d-%02dT%02d:%02d:%02d.%03d' \
        $(date -r "${timestamp%.*}" +"%Y %m %d %H %M %S")\
        $(( ${timestamp#*.} / 1000 ))
在上面,我假设您的时间戳看起来像“blahblahblah.728239”。结果是
printf
的一组参数,如
2013 04 16 11 03 17 728
以生成
2013-04-16T11:03:17.728

str="2013-04-05 13:33:53.180"

dateStr1=`date -d "$str" +'%Y-%m-%d %H:%M:%S.%N'`;

echo $dateStr1

dateStr2=`date -d "$dateStr1" +'%s'`

echo $dateStr2

dateStr3="$dateStr2"`echo ${dateStr1:20:3}`

echo $dateStr3

============================

[Output]
2013-04-05 13:33:53.180000000
1365140033
1365140033180

(以上考虑UTC中的DATEST)

,您可以简单地使用<代码> %3n < /代码>将纳秒截断为3个最有效的数字:

$ date +"%Y-%m-%d %H:%M:%S,%3N"
2014-01-08 16:00:12,746

使用»GNUBash,版本4.2.25(1)-发行版(i686 pc linux GNU)进行测试«

但是请注意,根据您的目标系统或bash版本,可能无法实现%N。 在嵌入式系统上测试»GNU bash,版本4.2.37(2)-发行版(arm buildroot linux gnueabi)«没有
%N

date +"%F %T,%N"
2014-01-08 16:44:47,%N
我忍不住要提供一个“便宜”的解决方案

echo $(date +"%Y-%m-%d-%H:%M:%S.")$((RANDOM%1000))

毕竟,如果准确性不如唯一性重要,就像我的情况一样。。。这里就是了。

最好的方法是使用python命令

$ python -c "from datetime import datetime; print datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]"
2017-02-15 15:03:03.496
然后,您可以在
~/.profile

$ alias datetime='python -c python -c "from datetime import datetime;...'
甚至创建一个shell函数

datetime(){
  python -c python -c "from datetime import datetime;...
}

要将特定时间戳转换为指定格式的日期字符串,可以使用:

TIMESTAMP=...
date -d @$TIMESTAMP +'%Y-%m-%d %H:%M:%S'
但是,此命令在MacOS上不起作用。为了使其在Linux和MacOS上都能工作,我使用了以下方法:

TIMESTAMP=...
if [ "$(uname)" == "Darwin" ]; then
  # running on MacOS
  date -r $TIMESTAMP +'%Y-%m-%d %H:%M:%S'
else
  # running on Linux
  date -d @$TIMESTAMP +'%Y-%m-%d %H:%M:%S'
fi

两次调用日期将导致不同的时间戳。。如果第一个电话是3.999,第二个是4.000。。。那么它看起来会像3.000。不确定这是否会成为您的问题。我提供了时间戳,因此这不是问题。为什么不添加3个随机数呢。像你这样挑选毫秒也不会更好。您确实应该为$timestamp提供一个示例值,以避免猜测——2。请指定您是否正在使用BSD(因为日期-r表示Gnu中的文件名。)--3。第一个示例是格式错误,将.s追加到输出中。但即使你的意思是%s,那也是错误的,因为这是自1970年1月以来的秒数。你可能会决定接受答案?很好。我修正了我的答案以反映这一点。由于OP似乎喜欢printf,而主要问题是将%s误认为%N,我认为最好的解决方案是
printf“%.23s”$(日期+“%Y-%m-%dT%H:%m:%s.%N”)
这给了我
2013-07-26T20:23:20.116
我意识到OP可能在BSD风格的操作系统上,因为BSD上的日期-r引用了从纪元开始的秒数(而不是Gnu中的文件名)——另请参见——在这种情况下,BSD缺少%N格式字符(BSD决定将自身限制为strftime格式)%02d格式在我尝试的两个Linux发行版(CentOS和Debian)上都不起作用,因为时间字段中的前导零被解释为八进制数。试试这个:
a=“2013 07 30 11 22 33 05678”;回显“$a printf as”;printf“%.4s-%.2s-%.2sT%.2s:%.2s:%.2s.%.3s'$a;echo-e“使用字符串”;打印文件“%04d-%02d-%02dT%02d:%02d:%02d.%03d”$a;echo-e“使用数字”
——这给了我一个错误
-bash:printf:05678:无效数字
。将字符串缩短1不会出错,但会给出错误的结果。
date
命令不是bash内置命令,因此bash的版本与是否实现
%N
无关。GNU日期实现它;非GNU日期,如OS X上的BSD版本,则不适用。对于时区感知:
from datetime import datetime;从tzlocal导入tzlocal;datetime.now(get_localzone()).strftime(“%Y%m%d\u%H%m%S.%N”)[:-3]
。注
tzlocal
是一个非标准模块。通过非标准的
pytz
模块也存在类似的解决方案。
TIMESTAMP=...
date -d @$TIMESTAMP +'%Y-%m-%d %H:%M:%S'
TIMESTAMP=...
if [ "$(uname)" == "Darwin" ]; then
  # running on MacOS
  date -r $TIMESTAMP +'%Y-%m-%d %H:%M:%S'
else
  # running on Linux
  date -d @$TIMESTAMP +'%Y-%m-%d %H:%M:%S'
fi