"%d/%m/%Y %H:%M" 形式の日付を秒に変換します。

"%d/%m/%Y %H:%M" 形式の日付を秒に変換します。

次のエラーが発生します。

date: invalid date '23/07/2021 14:44'

このコードを実行すると

start="23/07/2021 14:44"
startSec=`date +%s -d "${start}"`

私も試しました

start="23/07/2021 14:44"
startSec=`date -d "${start}" +%s`

文字列日付 ($start) を '%d/%m/%Y %H:%M' 形式で指定して秒に変換するにはどうすればよいですか。

ありがとうございます。

答え1

文字列操作を使用して入力をdate

または、Perlでは正確な入力形式を指定する必要があります。

start='23/07/2021 14:44'
perl -MTime::Piece -sE '
    say Time::Piece->strptime($input, "%d/%m/%Y %H:%M")->epoch
' -- -input="$start"
1627051440

文字列操作:文字をフィールドターミネータとしてread使用し、文字列を変数に分割するために使用します。$IFS

start='23/07/2021 14:44'
IFS='/ ' read -r day month year time <<<"$start"
date -d "$year-$month-$day $time"
Fri Jul 23 14:44:00 EDT 2021

<<<これには文字列リダイレクトというbashismがあります。より多くのPOSIXシェルを見るには:

IFS='/ ' read -r day month year time <<END_START
$start
END_START

答え2

この-dオプションは標準オプションではありませんdatedate標準ある形式で日付を取得して別の形式に再フォーマットする規則はありません。

BSD、GNU、ast-open、およびbusyboxにはすべて、これにオプションがありますが、date構文と4が異なるため、与えられたdateエラーメッセージの表現を使用しているように見えるGNUは、入力を指定できない唯一のものです。滞在。

したがって、必要なポータブルタスクを一人で行うことはできませんdate

perlここでは、適切なプログラミング言語(たとえば、/ python/ ...)を使用する代わりに、組み込みインタフェースを持つ言語からtcl次の言語に切り替えることができます。bashzshstrptime()

$ zmodload zsh/datetime
$ start='23/07/2021 14:44'
$ strftime -r '%d/%m/%Y %H:%M' $start
1627047840

これは、現地時間(私にはヨーロッパ/ロンドン時間)14:44:00と解釈されるその日付の新起源時間を提供します。タイムスタンプがUTC時間の場合は、次のように変更します。

$ TZ=UTC0 strftime -r '%d/%m/%Y %H:%M' $start
1627051440

スカラー変数に保存するには、この-sオプションを使用できます。

$ strftime -s startSec -r '%d/%m/%Y %H:%M' $start
$ echo $startSec
1627047840

ksh93シェルは、printf組み込み機能(またはdateast-openの一部として組み込まれている場合は組み込み機能)を使用して日付を解析することもできますが、最近はまれですが、Storesが必要なため、入力形式を指定するのは少し面倒です。以下を使用するシステムでは、変数を使用して指定されたファイルの形式のリスト$DATEMSK(標準の場合getdate()/dev/fd/x

$ { DATEMSK=/dev/fd/3 printf '%(%s)T\n' "$start"; } 3<<< '%d/%m/%Y %H:%M'
1627047840

(ksh93バージョン(Ubuntu 20.04 kshパッケージ)のコマンドグループなしでは動作しませんでした。最新バージョンではバグが修正されました。https://github.com/ksh93/ksh)。

そのタイムゾーンの現地時間は明確になる可能性が高いですが、23/07/2021 14:44このタイムスタンプ形式を使用すると、タイムゾーンがDSTを実装している場合はあいまいさが発生する可能性があります。

たとえば、私のヨーロッパ/ロンドンタイムゾーンには、次の2つのUnix時代があります25/10/2020 01:30

$ strftime '%d/%m/%Y %H:%M' 1603585800
25/10/2020 01:30
$ strftime '%d/%m/%Y %H:%M' 1603589400
25/10/2020 01:30

私のシステムでは、zsh strftime -r(system's strptime())は後者を選択します。

$ strftime -r '%d/%m/%Y %H:%M' '25/10/2020 01:30'
1603589400

答え3

GNU日付(およびその他)は、目的の形式の日付文字列を受け入れることはできません。主に米国の日付形式を受け入れます。

可変型を使用するには、最も簡単なソリューションを使用することです。busybox dateオプションに書式を設定するだけです(すでに持っています)。%d/%m/%Y %H:%M-D

$ busybox date -u +%s -D '%d/%m/%Y' -d "23/07/2021"
1626998400

現地時間であいまいな結果が出るよりも秒単位で与えられた正確な時間が答えになるように-u()オプションを含めることをお勧めします。utc現地時間は薄暗い夏時間、予期しない時間の変更などにより

可変日付文字列形式(BSD)を受け入れる別の日付実装があります。ただし、busyboxは非常に小さな実行ファイルであり、多くのユーティリティを置き換えることができ、非常に便利です。

答え4

GNUの日付があるので、GNU awkもあるか、または得ることができます。

$ start="23/07/2021 14:44"
$ awk -v start="$start" 'BEGIN{split(start,d,"[/ :]"); print mktime(d[3]" "d[2]" "d[1]" "d[4]" "d[5]" 0")}'
1627069440

上記はTZ設定を使用するか、UTCの場合はmktime()でUTCフラグを設定できます。

$ awk -v start="$start" 'BEGIN{split(start,d,"[/ :]"); print mktime(d[3]" "d[2]" "d[1]" "d[4]" "d[5]" 0",1)}'
1627051440

関連情報