날짜 및 시간에 시간 추가

날짜 및 시간에 시간 추가

날짜/시간 값에 오프셋 시간을 추가해야 합니다.

  1. 이전 날짜 가져오기(예 2023-10-19 00:00:00.000000: )

    previous_date=`TZ=TZ+24 date '+%Y-%m-%d 00:00:00.000000'`
    
  2. 시간대 오프셋(시간 단위)을 계산하고 절대값을 얻습니다(예: 동부 일광 절약 시간의 경우 4시간).

    offset_hours=$(date '+%:z' | sed 's/[-+]\(.*\)/\1/' | awk -F: '{print int($1 * 3600 + $2 * 60 + $3) / 3600}')
    
  3. 오프셋 시간을 추가하고 조정된 시작 날짜를 가져옵니다(예: 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'

printfAIX에서는 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.

모든 시간대 사이

위의 방법은 임의의 시간대 간에 변환하도록 쉽게 적용할 수 있습니다. 입력 날짜를 구문 분석하는 명령( TZksh93의 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

관련 정보