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.