31

我需要以特定格式获取日期,但不知道该怎么做。

这是我目前获取日期的方式。

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"`
4

9 回答 9

52

您可以简单地使用%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

testet 与 »GNU bash,版本 4.2.25(1)-release (i686-pc-linux-gnu)«

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

date +"%F %T,%N"
2014-01-08 16:44:47,%N
于 2014-01-08T15:04:09.920 回答
6

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

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'
于 2013-04-16T12:35:33.913 回答
4

我忍不住提供了一个“便宜”的解决方案......

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

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

于 2014-02-03T03:41:08.297 回答
2
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)

于 2013-10-17T10:21:27.417 回答
2

最好的方法是使用 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;...
}
于 2017-02-15T15:04:11.397 回答
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

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

于 2013-04-16T13:53:05.143 回答
1

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

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

于 2013-04-16T13:02:20.727 回答
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”。结果是printflike 2013 04 16 11 03 17 728to generate的一组参数2013-04-16T11:03:17.728

于 2013-04-16T14:49:41.927 回答
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
于 2020-06-08T08:49:46.357 回答