1970 년 1 월 1 일 이후의 날짜 계산


10

1970 년 1 월 1 일 이후의 일 수를 어떻게 계산할 수 있습니까? OpenLDAP 에서 shadowLastChange 속성 을 업데이트하기위한 것 입니다.

linux date 명령을 사용하여 이것을 수행하는 방법이 있습니까?


Bash와 가장 현대적인 Bourne 파생 쉘에서는 가독성 및 기타 이유로$() 백틱보다 선호 됩니다 . echo $(( $(date ...) / 86400 ))
— 추후 공지가있을 때까지 일시 중지되었습니다.

아직 2000이 없습니다. 누군가가 제목을 편집하고 고칠 수 있습니까 :-)
— Ring Ø

답변:


20

ring0은 몇 초 만에 나를 이겼지 만 전체 명령은 다음과 같습니다.

echo $(($(date --utc --date "$1" +%s)/86400))

UTC 시간으로 진행됩니다. 결과:

root@hostname:~# echo $((`date --utc --date "$1" +%s`/86400))
14984

울프 럼 알파의와 빠른 확인 이 올바른 값임을 보여줍니다.


1
윤초는 어떻습니까? :)
— netvope

1
@netvope 추가 윤초가 지나면 유닉스 시간이 다시 한 번 재설정됩니다. 그래서 매일 정확히 86400 유닉스 초를 추가합니다. 그러나 유닉스 시간 915148800은 UTC 1998-12-31T23 : 59 : 60 및 1999-01-01T00 : 00 : 00에 모두 해당 될 수 있습니다. en.wikipedia.org/wiki/Unix_time#Leap_seconds
— Debilski

9

이 date명령은 이후의 시간 (초)을 제공 할 수 있습니다 1970-01-01 00:00:00 UTC.

  date +"%s"

3600*24일 수 (UTC)를 얻기 위해 결과를 나눌 수 있습니다 .

예를 들어 Bash

  x=`date +"%s"` ; echo $(( $x / 3600 / 24 ))

일 수를 표시합니다.


9

이것이 가장 간단한 방법이라고 생각합니다.

expr $(date +%s) / 86400

이것이 왜 다운 보트입니까? 가장
— 훌륭하고

1

이 문제도 해결해야했지만 시간과 상관없이 하루 #와 동일한 가치를 얻고 싶었습니다. 여기에 표시된 것과 같은 접근 방식을 사용하면 현지 시간 자정 대신 UTC 자정에 값이 변경됩니다. 이것은 아마도 EU 또는 미국 동부 해안의 문제가 아닌 것 같습니다. UTC에 가깝기 때문에 일반적인 근무일 중에는 하루 값이 변경되지 않지만 캘리포니아에서는 하루 변화가 있습니다. PST 오후 4시에 발생할 수 있으며 이는 불편할 수 있습니다. 나는 호주인들이 늦은 아침에 하루 값이 바뀌는 것을 특히 짜증나게 할 것이라고 생각합니다.

이를 수정하려면 secs / day로 나누기 전에 UTC로부터 오프셋을 추가해야합니다. 다행히도 Linux date 명령에는 UTC로부터의 오프셋을보고 하는 % z 형식 시퀀스가 포함되어 있습니다. 표준 형식 (이 결과는 MDT 덴버 시간에 해당) :

$ date +%z
-0600

. . . 계산에서 직접 사용할 수없는 경우 올바른 수정자가 원하는 것을 산출합니다.

$ date +%-:::z
-6

일반적인 secs / hours / days 변환과 함께 사용하면 다음과 같이 1/1/1970 이후의 날을 출력해야하며 1/1/1970 자체는 0 일이며 현지 자정에 값이 증가합니다.

echo $(( ( $(date +"%s + ( %-:::z * 3600)") ) / 86400 ))

"+5 : 30" date +%-:::z이 "표현식에서 유효하지 않은 문자"오류를 생성하기 때문에 전체 시간 (예 : 인도, TZ = 아시아 / 콜카타)으로 UTC에서 오프셋되지 않은 시간대에 대해서는이 간단한 계산이 작동하지 않습니다. 위의 진술에서 사용될 때.

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