web-dev-qa-db-ja.com

異なる形式の変数から日付を抽出する

問題を説明しましょう

$ date +%c -d "$d"
Tue 31 Dec 2013 01:13:06 PM CET
$ date +'Today is %F' -d "$d"
Today is 2013-12-31

このソリューションは現在の日付に対応しています。

しかし、私は現在の日付以外の日付を格納する1つの変数を持っています

$Prev_date="Wed Dec 25 06:35:02 EST 2013" 

この日付を2013-12-25として読み取り、変数に格納するための解決策を探しています。

私はこれを試しました:

a=`date --date=$Prev_date '+%y/%m/d'`
echo $a

このエラーが発生しています:

date: illegal option -- date=Wed
usage: date [-u] mmddHHMM[[cc]yy][.SS]
date [-u] [+format]
date -a [-]sss[.fff]
7
Prabhat

-dオプションはGNU固有です。

ここでは、日付計算を行う必要はありません。すでにすべての情報が含まれている文字列を書き換えるだけです。

a=$(printf '%s\n' "$Prev_date" | awk '{
  printf "%04d-%02d-%02d\n", $6, \
  (index("JanFebMarAprMayJunJulAugSepOctNovDec",$2)+2)/3,$3}')
5

私はあなたがバッシュについて話していると思います。その場合、"パラメータの引数の周囲に--dateがありません。

の代わりに

a=`date --date=$Prev_date '+%y/%m/d'`

これを試して

a=`date --date="$Prev_date" '+%y/%m/d'`

d%を持っているはずです。それでそれはそのようになるでしょう:

a=`date --date="$Prev_date" '+%y/%m/%d'`

エラーがdateコマンドの使用を示した理由は次のとおりです。

"の周りに$Prev_dateがない場合、変数は置換され、コマンドは次のようになります。

a=`date --date=Wed Dec 25 06:35:02 EST 2013 '+%y/%m/d'`

そのため、Wedのみが--dateの引数として使用され、$Prev_date文字列の他の部分はすべて、dateコマンドの個別のパラメーターと見なされます。したがって、日付はDecというパラメーターを認識しておらず、ヘルプ出力であることを示しています。

8
replay

私が正しく理解している場合は、日付を保存して、後で再利用して同じ日付を別の形式で印刷できるようにする必要があります。このため、date -dコマンドで簡単に解析できる形式で日付を保存し、dateコマンドで形式を設定することをお勧めします。

私の知る限り、+%Y%m%d %H:%M:%Sという形式は、プラットフォームに最も依存しません。だから、この形式で日付を保存しましょう:

d=$(date '+%Y%m%d %H:%M:%S')

その後、この日付をさまざまな形式で印刷できます。次に例を示します。

$ date +%c -d "$d"
Tue 31 Dec 2013 01:13:06 PM CET
$ date +'Today is %A' -d "$d"
Today is Tuesday
$ date +'Today is %F' -d "$d"
Today is 2013-12-31

[〜#〜]更新[〜#〜]

Wed Dec 25 06:35:02 EST 2013のような日付文字列が指定されている場合、date -dを使用してそれを解析し、その形式を変更することができます。次に例を示します。

$ date +%F -d 'Wed Dec 25 06:35:02 EST 2013'
2013-12-25

これはGNU日付で機能します。システムで機能しない場合は、代わりにgdateコマンドを試してください通常それは現代のシステムに存在します。

2
janos

Mac OS Xでは、FreeBSD dateコマンドを使用して、エポック時間を介して変換を行うことができます。

Epoch_time="$(LANG=C TZ='EST' date -j -f "%a %b %d %T %Z %Y" "Wed Dec 25 06:35:02 EST 2013" "+%s")"
a="$(date -r $Epoch_time '+%F')
echo "$a"  #  2013-12-25
1
nico

最初の出力はGのようです。Cにはすでに実際の日付(火)の最初の単語が含まれているため、実行しようとすると

`tue …format… `

あなたのシェルはtueは有効なコマンドではないと答えます。

$ A=date
$ echo $($A)
Mar 31 déc 2013 12:21:48 CET
$ B=$($A)   
$ echo $B
Mar 31 déc 2013 12:22:12 CET

Cで行ったように、A変数に日付を格納してみてください。

ちなみに、あなたはそれらのためのより良い名前を見つけることができませんか?

1
Aif

他の人が指摘したように、問題は、上記の$Cに格納されている日付がサブシェルに渡される前に( ``を使用して)評価されるため、サブシェルが 'という名前のリテラルコマンドを見つけようとしていることですTue '(日付文字列の開始)。

これを修正するには、-dオプションを使用して、日付コマンドをdateのGNUバージョンに戻す)を渡す必要があります。これにより、既存の日付が入力。

上記のサンプルコードを使用してこれを説明しました:

C=$(date)
G=$(gdate '+%Y%m%d' -d "$C")

echo "C = $C"
echo "G = $G"

どの出力

C = Tue Dec 31 10:33:29 EST 2013
G = 20131231

注:これをシステム(OS X)で動作させるには、gdateを使用する必要がありました。

GNU compatible dateコマンドがなく、何らかの理由でインストールできない場合は、日付文字列を直接操作することをお勧めします。このようなものを使用して:

C=$(date)
D=$(echo "$C" | awk -F' ' '{ printf "%s-%s-%s", $6, $2, $3 }')

echo "C = $C"
echo "D = $D"

次の出力が生成されます。

C = Tue Dec 31 12:03:27 EST 2013
D = 2013-Dec-31
1
Donovan

GNU dateを使用して正確な時刻を保存したい場合、次のオプションはdateが再び解析できる形式で出力できることがわかりました。

date -R
date --iso-8601=ns         # <-- JavaScript's new Date() does not parse this one
date --iso-8601=seconds
date --rfc-3339=ns
date --rfc-3339=seconds

ナノ秒を記録するのはnsオプションだけであることに注意してください(ほとんどのファイルシステムは秒を格納するだけです)。

(興味の対象として、Node.JSとFirefoxでもテストしましたが、指示されたものだけが解析に失敗しました。)

たとえば、ファイルの日付を変数に読み込み、解析して表示するには、次のようにします。

# Record when bash was compiled into a variable
prev_date="$(date --rfc-3339=ns -r /bin/bash)"

# Parse the variable and display in desired format
echo "Date is: $(date -d "$prev_date" '+%y/%m/%d')"

私が今知りたいこと:BSD dateで同じことをする方法?

0
joeytwiddle