日付/時刻値にオフセット時間を追加する必要があります。
前の日付を取得する(例
2023-10-19 00:00:00.000000
:)previous_date=`TZ=TZ+24 date '+%Y-%m-%d 00:00:00.000000'`
タイムゾーンオフセット(時間単位)を計算し、絶対値を取得します(たとえば、東部の夏時間の場合は4時間)。
offset_hours=$(date '+%:z' | sed 's/[-+]\(.*\)/\1/' | awk -F: '{print int($1 * 3600 + $2 * 60 + $3) / 3600}')
オフセット時間を追加し、調整された開始日を取得します(例:2023-10-19 04:00:00.000000000)
startdateandtime=$(TZ="UTC" date -d "$previous_date $offset_hours hours" '+%Y-%m-%d %H:%M:%S.%N')
最初の2つのコマンドはAIXで動作しますが、Linuxで動作する3番目のコマンドはAIXで失敗します。これを実装し、AIXで3番目のコマンドを実行するのに役立ちます。
ありがとう
答え1
タイムスタンプを1時間に変換したいようです。
固定オフセットを追加することは正しいアプローチではありません。オフセットは、DSTによって一年中さまざまな時間帯で変更され、DSTを停止することを決定できる政府の気まぐれに応じて変更されるか、DSTがソートされるためです。他の国と(または合併)...
たとえば、米国ニューヨークでは、2023年10月19日にUTCに変換するために4時間を追加/削除することは有効ですが、2023年12月には有効ではなく、2030年10月には有効です。しない可能性があります。
解析された出力方法では、date +%:z
タイムゾーンデータベースからオフセットを取得しますが、変換したいタイムスタンプのオフセットではなく現在の時間を取得します。これも無効です。
UTC時間を現地時間に変換
GNUを使用すると、date
次のことができます。
$ export TZ=America/New_York
$ date -d '2023-10-19 00:00:00.000000 +0000' '+%F %T.%6N'
2023-10-18 20:00:00.000000
移植可能には、次のものを使用できますperl
。
perl -MPOSIX -MTime::Piece -le '
$format = "%Y-%m-%d %H:%M:%S";
for (@ARGV) {
s{[^.]*}{
$t = Time::Piece->strptime($&, $format);
strftime($format, localtime $t->epoch)
}e;
print;
}' '2023-10-19 00:00:00.000000'
printf
AIXでは、ksh93の組み込みコマンドを使用できます。
printf '%(%F %T.%6N)T\n' '2023-10-19 00:00:00.000000 +0000'
またはzshを使用してください(使用可能な場合)。
zmodload zsh/datetime
datetime='2023-10-19 00:00:00.000000'
format='%Y-%m-%d %H:%M:%S'
TZ=UTC0 strftime -rs epoch $format ${datetime%.*} &&
strftime -s t $format $epoch &&
print -r -- $t${(M)datetime%.*}
現地時間1をUTC時間に変換
そしてzsh
:
zmodload zsh/datetime
datetime='2023-10-19 00:00:00.000000'
format='%Y-%m-%d %H:%M:%S'
strftime -rs epoch $format ${datetime%.*} &&
TZ=UTC0 strftime -s t $format $epoch &&
print -r -- $t${(M)datetime%.*}
ksh93の使用:
datetime='2023-10-19 00:00:00.000000'
format='%Y-%m-%d %H:%M:%S.%6N'
t=${ printf '%(%s)T' "$datetime"; } &&
TZ=UTC0 printf "%($format)T\n" "#$t"
そしてperl
:
perl -MPOSIX -le '
$format = "%Y-%m-%d %H:%M:%S";
for (@ARGV) {
if (/^(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)(.*)/) {
print strftime($format, gmtime(mktime($6,$5,$4,$3,$2-1,$1-1900))) . $7;
}
}' '2023-10-19 00:00:00.000000'
GNUの使用date
:
t=$(date -d '2023-10-19 00:00:00.000000' +%s.%N) &&
TZ=UTC0 date -d "@$t" '+%F %T.%6N'
America/New_York
時間帯に彼らは与えられる2023-10-19 04:00:00.000000
。
すべてのタイムゾーン間
上記の方法は、任意の時間帯間の変換に簡単に適用できます。入力日付を解析するコマンド(TZ
ksh93のstrftime -r
、、date -d
最初のものprintf
)と出力日付の形式を指定するコマンド(strftime
、、date
補助)にprintf
適切な設定を指定するだけです。
:を使用すると、解析と書式設定の前に環境変数を設定perl
できます。TZ
perl -MPOSIX -le '
$format = "%Y-%m-%d %H:%M:%S";
for (@ARGV) {
if (/^(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)(.*)/) {
$ENV{TZ} = "America/New_York";
my $t = mktime($6,$5,$4,$3,$2-1,$1-1900);
$ENV{TZ} = "Asia/Kolkata";
print strftime($format, localtime($t)) . $7;
}
}' '2023-10-19 00:00:00.000000'
1 現地時間形式は DST 情報が不足して曖昧ですが、変換は安定して行われません。たとえば、タイムゾーン(2023-11-05 05:23:00.000000 UTC、2023-11-05 06:23:00.000000 UTC)で2回発生します2023-11-05 01:23:00.000000
。America/New_York