비 GNU 시스템에서 1125 일 전의 날짜를 계산합니까?

Unix Bash 명령 줄에서 기본 운영 체제 (예 : Perl 또는 Python 없음)를 사용하여 1125 일 전의 날짜를 계산하고 싶습니다.

GNU Date 를 실행하는 시스템에서 다음과 같이 할 수 있습니다.

ubuntu $ date --date="1125 days ago" Wed Nov 7 15:12:33 PST 2007 

FreeBSD 또는 MacOSX 시스템은 GNU Date와 함께 제공되지 않으며 “X 일 전”과 같은 값을 지원하지 않습니다.

freebsd81 $ date --date="+1125 days ago" date: illegal option -- - 

I Mac 또는 FreeBSD 시스템에서 며칠 전의 날짜를 계산할 수 있지만 며칠로 제한됩니다.

# Today is really Dec 6, 2010. 4 days ago it was: macosx $ TZ=GMT+96 date +%Y%m%d 20101202 # But that doesn"t work if I want to see the date 8 days ago: macosx $ TZ=GMT+192 date +%Y%m%d 20101206 

가능한가요? Perl 또는 Python과 같은 도구를 탐색하지 않고 비 GNU 시스템에서 이전 날짜를 계산합니까? 아니면 더 강력한 스크립팅 언어를 사용해야합니까?

답변

음, 다음과 같은 교활한 작업을 수행 할 수 있습니다.

 $ echo "`date +%s` - (1125 * 24 * 60 *60)" |bc 1194478815 $ date -r 1194478689 Wed, 07 Nov 2007 18:38:09 -0500 

OpenBSD (확실히 gnu 기반 날짜가 아님)에서 테스트했으며 작동하는 것 같습니다.

단계별 분석 :

  • 현재 unixtime (unix epoch 시작 이후 초) 가져 오기 :
 $ date +%s 1291679934 
  • 1125의 초 수 가져 오기 일
 $ echo "1125 * 24 * 60 *60" | bc 97200000 
  • 하나에서 다른 하나 빼기 (1291679934-97200000) = 1194478815

  • 새로운 unixtime (1194478815)을 사용하여 예쁜 날짜를 인쇄합니다.

     $ date -r 1194478689 Wed, 07 Nov 2007 18:38:09 -0500 
  • 대안으로 solaris에서 이렇게하면 날짜를 인쇄 할 수 있습니다 * :

    /bin/echo "0t1194478815>Y\n<Y=Y" |adb

* http://www.sun.com/bigadmin/shellme/

또한 Solaris에서 date 명령에서 현재 타임 스탬프를 가져 오는 대안 **은 다음과 같습니다.

/usr/bin/truss /usr/bin/date 2>&1 | nawk -F= "/^time()/ {gsub(/ /,"",$2);print $2}"

** http://www.commandlinefu.com/commands/view/7647/unix-timestamp-solaris

댓글

  • %sdate -r는 BSDism입니다 (초창기부터이므로 ' 모든 BSD 플랫폼에 있음). ' 시스템 V 플랫폼에서 볼 수있을 것으로 기대하지 마십시오 (예 : Solaris에는 둘 다 없습니다).
  • 아, Solaris, 내가 당신을 얼마나 좋아하는지 … (;
  • @Gilles : 확실합니까? Solaris에는 다른 유닉스 버전을 포함하는 / usr / ucb / bin과 같은 수많은 bin 디렉토리가 있습니다. SunOS 4.X는 결국 BSD 기반이었습니다.
  • 윤초 및 달력 변경과 같이 중간 요일이 60 * 60 * 24 초보다 많거나 적은 경우 실패합니다.
  • @Sparr : 좋은 지적입니다. 접근 방식은 현재 절대 날짜에서 현재 시간을 빼고 12 * 60 * 60을 더하는 것입니다. 이렇게하면 10:59에서 13:01 사이의 시간이 반환됩니다. 여기에 24 시간 기간을 더하고 해당 날짜는 안전합니다.

답변

이전 답변은 너무 복잡했습니다. FreeBSD / macOS에는 iv MAN 페이지 date에 대한 id = “5d3ae13b14″>

플래그 (축약 된 설명) :

조정 (즉, 현재 날짜를 가져와 조정 결과를 표시합니다. 실제로 날짜를 설정하지 않음) val에 따라 초, 분,시, 월일, 요일, 월 또는 연도. val 앞에 더하기 또는 빼기 기호가 있으면 나머지 문자열에 따라 날짜가 앞뒤로 조정됩니다. 그렇지 않으면 날짜의 관련 부분이 설정됩니다. 이 플래그를 사용하여 필요한만큼 날짜를 조정할 수 있습니다. 플래그는 주어진 순서대로 처리됩니다.

따라서 date -v1125d는 필요한 작업을 간단히 수행합니다.

$ date; date -v-1125d Thu 19 Oct 2017 11:35:25 EDT Sat 20 Sep 2014 11:35:25 EDT 

답변

비슷한 문제가 발생했습니다. dateutils pkg . 나를 위해 간단한 pkg_add dateutils였습니다.

#!/bin/ksh # Using dateutils dadd (get current date) -1month -f (format to strftime) # Set Year in YYYY formant y is YY format lastMonth=$(dadd date -1mo -f "%Y.%m") echo $lastMonth mkdir /home/$usr/History/$lastMonth 

내 결과는

#2018.11 

UPDATE 1

2018.12.10에서이 명령을 실행하고 있습니다.

HostNameHere# dadd date -1125d -f "%Y.%m" 

결과

 2015.11 

내가 말할 수있는 모든 시간 더하기 또는 빼기를 지원합니다. 다음은 인쇄에 도움이되는 명령입니다. #dadd -h (전체 출력물이 아닙니다. 옵션에 대한 자세한 정보가 있습니다.

 Usage: dadd [OPTION]... [DATE/TIME] [DURATION] Add DURATION to DATE/TIME and print the result. If DATE/TIME is omitted but DURATION is given, read a list of DATE/TIMEs from stdin. If DURATION is omitted but DATE/TIME is given, read a list of DURATIONs from stdin. Durations are specified as nY, nMO, nW, or nD for years, months, weeks, or days respectively, or nH, nM, nS for hours, minutes, and seconds, where N is a (possibly negative) number. The unit symbols can be written lower-case as well (y, mo, w, d, h, m, s) and the unit symbol `d" can be omitted. Note that duration addition is not commutative! 2000-03-30 +1mo +1d -> 2000-05-01 2000-03-30 +1d +1mo -> 2000-04-30 

다음은 명령입니다.

여기 는 서식 옵션입니다.

댓글

  • (1)이 프로그램이 iv id = “6d048d07b4를 지원하는 것은 ' 다행입니다. “>

. 질문에서 묻는 것처럼 사용자가 1125 일 전의 날짜를 계산할 수 있음을 보여줄 수 있습니까? (2) 질문은 기본을 사용하여 "라고 말합니다. 운영 체제 (예 : Perl 또는 Python 없음). " 새 패키지 추가를 배제하는 것 같습니다.

  • @ G-Man 댓글 주셔서 감사합니다. 저는 StackExchange에 기여하는 것이 처음입니다. 도와 주셔서 감사합니다. 업데이트 1 참조
  • 답글 남기기

    이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다