web-dev-qa-db-ja.com

丸められたミリ秒のBashシェルスクリプトを使用してタイムスタンプから書式設定された日付を取得する

特定の形式で日付を取得する必要がありますが、その方法がわかりません。

現時点での日付の取得方法は次のとおりです。

date -r "$timestamp" +'%Y-%m-%dT%H:%M:%S.s'

ただし、問題は、ミリ秒が必要な形式に対して桁数が多すぎることです。ミリ秒を3桁に制限する必要があります。

どのように私はそのようなことをすることができますか?

現在の回避策

正確ではありませんが、動作します。その後、ミリ秒を計算し、文字列の最初の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"`
22
StuStirling

単に%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)-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
38
Joe

これを行うための無数の方法.. 1つの簡単な方法は、末尾の数字を削除することです...

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'
5
Iamiuru

「安い」ソリューションを提供せざるを得ません...

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

結局のところ、私の場合のように、精度が一意性よりも重要でない場合は...ここにあります。

3
azatar

いくつかのステップなしでそれを行う方法を考えることはできませんが、これはあなたをそこに導きます:

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

2013-04-16 08:51:48.874

すべてのコンポーネントはこれまでの1回の呼び出しから取得されるため、一貫性があります。

1
William
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を考慮する)

1
punchoyeah

一つの問題: %sはミリ秒の日付形式ではなく、現在のエポックの秒です。 %Nはナノ秒を与えます。ミリ秒を与えるGNU日付の指定された日付形式がわかりません。

date --helpすべてのフォーマットオプションを表示します。

1
jim mcnamara

最良の方法は、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;...'

または、シェル関数を作成する

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

printfを使用して実際のフォーマットを行います。 dateを使用して、printfがフォーマット文字列を埋める必要がある引数のセットを生成します。

printf '%04d-%02d-%02dT%02d:%02d:%02d.%03d' \
        $(date -r "${timestamp%.*}" +"%Y %m %d %H %M %S")\
        $(( ${timestamp#*.} / 1000 ))

上記では、タイムスタンプが「blahblahblah.728239」のように見えると仮定しています。結果は、2013 04 16 11 03 17 728のようなprintfの引数のセットであり、2013-04-16T11:03:17.728を生成します。

0
chepner