Bash: 미국 날짜를 1일 줄입니다 mmddyyyy

Bash: 미국 날짜를 1일 줄입니다 mmddyyyy

문제를 단순화하기 위해 변수(2015년 10월 15일을 나타냄)가 있다고 가정해 보겠습니다. dat="10152015" 결과는 다음 dat과 같습니다.10142015

오늘 날짜를 사용하지 않습니다.

내가 겪고 있는 문제는 날짜를 1일 줄이는 방법을 찾는 것입니다. 네 번째 자리만 줄여도 되지만 이건 달력이에요.

내 현재 아이디어는 그것을 유닉스가 이해하는 형식(그것이 무엇이든)으로 변환한 다음 거기에서 작업을 시도한 다음 답변을 다시 변환하는 것입니다.

답변1

GNU 날짜가 필요합니다:

dat="10152015"
date -d "${dat:4}${dat:0:4} yesterday" +%m%d%Y 

YYYYMMDDISO 9601 날짜 형식이며, MMDDYYYY압축된 US 형식은 일반 하위 문자열 확장을 사용하여 절반을 교환하는 것만으로 해당 형식으로 변환할 수 있습니다.

이를 위해서는 gnu 날짜가 필요하며 다른 버전의 날짜는 현재가 아닌 시간 표시를 지원하지 않는다고 생각합니다.

답변2

처음에는 sed사용자가 제공한 10152015 형식을 명령 및 해당 옵션 mm/dd/yyyy의 GNU 구현 에서 이해할 수 있는 형식 으로 변환하는 데 사용되었습니다. 이는 슬래시를 삽입하여 원래 날짜를 반영함으로써 수행 됩니다 . 이 형식화된 날짜 값은 에 저장됩니다 . 다음으로 인쇄 출력 형식을 "mmddyyyy"라고 부르고 현재 날짜로 사용되는 날짜를 인쇄하도록 지시합니다.date-dsed/Ddateyesterday$D

#!/bin/sh
D=$(echo "${1-10152015}" | sed 's,^\(..\)\(..\)\(....\)$,\1/\2/\3,')
date +%m%d%Y -d"$D yesterday"

답변3

bash날짜 조작 기능이 매우 제한되어 있으므로 날짜 계산에 가장 적합한 셸은 아닙니다.

그리고 zsh:

zmodload zsh/datetime
d=03012012
strftime -rs d %m%d%Y%H ${d}12
strftime %m%d%Y $((d-86400))

그리고 ksh93:

d=03012012
printf "%(%m%d%Y)T\n" "${d:4}${d:0:4} yesterday"

를 사용하려면 bash수동으로 계산을 수행하거나 perl이 유틸리티의 일부 GNU 또는 FreeBSD 확장 에 의존해야 합니다 date.

답변4

참고: 다음은 GNU coreutils의 GNU 날짜를 가정합니다. 다른 유틸리티가 있는 경우 시스템 날짜에 맞게 조정하세요 date.

당신의 생각이 맞습니다. 에포크(1970년 1월 1일 00:00:00) 이후의 초 단위로 변환해야 합니다.

GNU Date는 해석하는 날짜 형식이 매우 유연하지만 MMDDYYYY는 그중 하나가 아닙니다. 다행히도 sed를 사용하여 날짜를 YYYY-MM-DD 형식으로 다시 포맷한 후 데이터에 입력할 수 있습니다.date -d

dat="10152015"
secs=$(date +%s -d $(echo "$dat" | sed -e 's/\(..\)\(..\)\(....\)/\3-\1-\2/'))
newsecs=$((secs - 86400))
date -d "@$newsecs"

관련 정보