我需要以特定格式获取日期,但无法知道如何操作。
以下是我现在的约会方式。
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"`
答案 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