Bash-날짜, 32 비트 LINUX 시스템에서 2038 버그 해결


9

나는 "2038 년 버그"를 우연히 발견하게하는 작은 bash 스크립트를 작성했다 . 나는 전에이 문제에 대해 몰랐고 스크립트 가이 마술 날짜 (2038 년 1 월 19 일 UTC : 03:14:07 UTC)를 계산하려고했을 때 --debug얻은 결과 를 게시하는 것에 감히 도전했습니다 date.

date -d "20380119"

date: parsed number part: today/this/now
date: input timezone: +01:00 (set from system default)
date: warning: using midnight as starting time: 00:00:00
date: starting date/time: '(Y-M-D) 2038-01-19 00:00:00 TZ=+01:00'
date: '(Y-M-D) 2038-01-19 00:00:00 TZ=+01:00' = 2147468400 epoch-seconds
date: output timezone: +01:00 (set from system default)
date: final: 2147468400.000000000 (epoch-seconds)
date: final: (Y-M-D) 2038-01-18 23:00:00 (UTC0)
date: final: (Y-M-D) 2038-01-19 00:00:00 (output timezone TZ=+01:00)
Tue Jan 19 00:00:00 CET 2038

date -d "20380119 + 1 days"

date: parsed hybrid part: +1 day(s)
date: input timezone: +01:00 (set from system default)
date: warning: using midnight as starting time: 00:00:00
date: starting date/time: '(Y-M-D) 2038-01-19 00:00:00 TZ=+01:00'
date: warning: when adding relative days, it is recommended to specify 12:00pm
date: error: adding relative date resulted in an invalid date: '(Y-M-D) 2038-01-20 00:00:00 TZ=+01:00'
date: invalid date '20380119 + 1 days'

date -d "20380120" --debug

date: parsed number part: today/this/now
date: input timezone: +01:00 (set from system default)
date: warning: using midnight as starting time: 00:00:00
date: error: invalid date/time value:
date:     user provided time: '(Y-M-D) 2038-01-20 00:00:00 TZ=+01:00'
date:        normalized time: '(Y-M-D) 2038-01-20 00:00:00 TZ=+01:00'
date: 
date:      possible reasons:
date:        numeric values overflow;
date:        missing timezone
date: invalid date '20380120'

date이 날짜에 GNU를 계산할 수있는 방법 이 있습니까?
(LINUX 32 비트 시스템에서)

  Operating System: Debian GNU/Linux buster/sid
            Kernel: Linux 4.12.0-2-686-pae
      Architecture: x86

3
32 비트 시스템에서이를 해결하는 한 가지 방법은 * BSD OS를 사용하는 것입니다.
Rui F Ribeiro


1
@Kusalananda 불분명해서 죄송합니다. 예, GNU를위한 방법을 요구하고 date있습니다. 질문을 편집하겠습니다 ...
nath

FWIW에서 OpenBSD 는 2014 년에이를 수정했습니다 . 많은 작업 이었지만 어쨌든 그들은 모든 관련 비트를 패치했습니다.
사토 카츠라

답변:


14

date32 비트 리눅스에서 GNU를 고수하고 싶다면 , 2038 이후의 날짜와 함께 사용할 수있는 쉬운 방법 은 없습니다 . coreutils관리자는 이것을 coreutils버그로 간주하지 않습니다. , 그래서 거기에 수정을 기대하지 않는다는 - 수정이있을 것이다 C 라이브러리 와 커널 에서 가져 옵니다 . 진행중인 작업으로 놀고 싶다면 다음이 필요합니다.

그리고 상당한 수준의 기술과 인내심.

32 비트 Linux 환경에서 2038이 처리 될 예정인 방법에 대한 자세한 내용은 LWNDebConf 17의 2038 BoF 기록 (후속 의견과 LWN 참조 )을 참조하십시오. 이 2019 년 1 월 LWN 기사 는 커널에서 구현되고있는 변경 사항에 대해 설명합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.