GNU가 아닌 시스템에서 1125일 전 날짜를 계산하시겠습니까?

GNU가 아닌 시스템에서 1125일 전 날짜를 계산하시겠습니까?

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

실행 중인 시스템에서GNU 날짜, 다음과 같이 할 수 있습니다.

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

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

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

할 수 있는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가 아닌 시스템에서 이전 날짜를 계산할 수 있나요? 아니면 더 강력한 스크립팅 언어를 사용해야 합니까?

답변1

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

$ echo "`날짜+%s` - (1125 * 24 * 60 *60)" |bc
1194478815
$ 날짜 -r 1194478689
2007년 11월 7일 수요일 18:38:09 -0500

OpenBSD(확실히 현재까지는 GNU 기반이 아님)에서 테스트되었으며 작동하는 것 같습니다.

단계별로 분석해 보세요.

  • 현재 unixtime(unix epoch가 시작된 이후의 초 수)을 가져옵니다.
  $ 날짜+%s
  1291679934
  
  • 1125일의 초 수를 구하세요.
  $echo "1125*24*60*60" BC |
  97200000
  
  • 하나 빼기 다른 하나 (1291679934 - 97200000) = 1194478815

  • 새로운 Unixtime을 사용하여 좋은 날짜를 인쇄하세요(1194478815).

    $ 날짜 -r 1194478689
    2007년 11월 7일 수요일 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/date2>&1 | nawk -F= '/^time()/ {gsub(/ /,"",$2);print $2}'

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

답변2

이전 답변이 너무 복잡했습니다. FreeBSD/macOS에는 다음의 , -v플래그가 있습니다.date매뉴얼 페이지(간략한 설명):

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

그러니 당신의 목적을 위해 date -v1125d필요한 것만 하세요

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

답변3

비슷한 문제가 있었는데 발견했습니다.데이트 키트OpenBSD 6.4의 경우. 나에게 그것은 단순한 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

업데이트 1

2018.12.10에 이 명령을 실행했습니다.

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

결과

 2015.11

언제든지 덧셈이나 뺄셈을 지원합니다. 이것이 help 명령이 출력하는 내용입니다. #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

여기그것은 명령이다.

여기형식 옵션입니다.

관련 정보