날짜/시간 값에 오프셋 시간을 추가해야 합니다.
이전 날짜 가져오기(예
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에서 작동하는 세 번째 명령은 AIX에서 실패합니다. 이를 구현하고 AIX에서 세 번째 명령을 실행하는 데 도움이 필요합니다.
감사해요
답변1
타임스탬프를 한 시간대로 변환하려는 것 같습니다.
고정 오프셋을 추가하는 것은 올바른 접근 방식이 아닙니다. 오프셋은 DST로 인해 일년 내내 여러 시간대에서 변경되고 DST를 중지하기로 결정할 수 있는 정부의 변덕에 따라 변경되거나 DST가 정렬되기 때문입니다. 다른 나라와 (또는 합병)...
예를 들어, 미국 뉴욕에서는 UTC로 변환하기 위해 4시간을 추가/제거하는 것이 2023년 10월 19일에 유효할 수 있지만 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)에 두 번 발생합니다 2023-11-05 01:23:00.000000
.America/New_York