从带有圆角毫秒Bash Shell脚本的时间戳获取格式化日期

时间:2013-04-16 12:12:24

标签: 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_string_milli=`date -r "$timestamp" +'%s'`
date_string="$date_string_one"`printf "%.3s" "$date_string_milli"`

9 个答案:

答案 0 :(得分:37)

您可以简单地使用%3N将纳秒截断为3位最高位数:

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

$ date +"%F %T,%3N"
2014-01-08 16:00:12,746

测试»GNU bash,版本4.2.25(1) - 发布(i686-pc-linux-gnu)«

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

date +"%F %T,%N"
2014-01-08 16:44:47,%N

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:1)

一个问题:%s不是毫秒的日期格式,它是当前纪元的秒数​​。 %N给出纳秒,我不知道GNU日期的指定日期格式给出毫秒。

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

答案 3 :(得分:1)

如果没有几个步骤就无法想到这样做的方法,但这会让你到达那里:

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

2013-04-16 08:51:48.874

由于所有组件都是从一次调用中获取的,因此它们将保持一致。

答案 4 :(得分:1)

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中的datestr)

答案 5 :(得分:1)

我无法提供“便宜”的解决方案......

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

毕竟,如果准确性不如唯一性那么重要,就像我的情况一样......在这里你就拥有它。

答案 6 :(得分:1)

最好的方法是炮轰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;...
}

答案 7 :(得分:0)

使用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

答案 8 :(得分:0)

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

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