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
댓글
답변
이전 답변은 너무 복잡했습니다. 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 없음). " 새 패키지 추가를 배제하는 것 같습니다.
%s
및date -r
는 BSDism입니다 (초창기부터이므로 ' 모든 BSD 플랫폼에 있음). ' 시스템 V 플랫폼에서 볼 수있을 것으로 기대하지 마십시오 (예 : Solaris에는 둘 다 없습니다).