1월 31일에 사용하면 어떤 성능을 발휘하나요 at midnight next month
? 3월 4일인가요, 아니면 2월 28일인가요? 아니면 3월 31일인가요?
답변1
이 답변의 목적은 귀하가 이미 받은 다른 (올바른) 답변을 보완하고 몇 가지 추가 기술 정보를 제공하는 것입니다.
at
명령이 명령을 받을 때NEXT <inc_dec_period>
1 , 현재 날짜를 시간 구조로 사용( struct tm
2 )지정된 기간에 "1"을 추가합니다..
따라서 at
명령이 실행 되면 NEXT MONTH
현재 날짜를 사용하고 3월에 "1"을 추가하여 0 (1월)이 1(2월)이 되고 1이 2(3월)가 되는 식으로 진행됩니다. 이는 date -d 'now + 1 month'
명령과 동일합니다.
이제 중요한 부분은 다음 date
과 같습니다.at
그런 다음 명령은 작업 후에 생성된 새 시간 구조를 가져와 mktime(3)
새 절대 시간 4 를 반환 하는 라이브러리 호출에 대한 인수 로 사용합니다.mktime(3)
문서에는 다음과 같이 명시되어 있습니다.
이
mktime()
기능이 수정되었습니다.Tm 값2 구조는 다음과 같습니다. [...]구조 구성원이 유효 범위를 벗어나면 정규화됩니다(예: 10월 40일이 11월 9일로 변경됨).);
예를 들면 다음과 같습니다.
- 현재 날짜가 2023-08-31이라면,
- 명령은
next month
, - 새로운 시간 구조는 2023년 9월 31일입니다.
31은 9월의 유효한 간격을 벗어나므로 문서에 명시된 대로 2023년 10월 1일로 정규화됩니다.
$ date -d '2023-08-31 + 1 month' --rfc-3339=date
2023-10-01
현재 날짜가 2023-01-31인 경우 동일한 명령의 결과 at
는 시간 구조 2023-02-31이며, 이는 2023-03-03으로 정규화됩니다.
$ date -d '2023-01-31 + 1 month' --rfc-3339=date
2023-03-03
$ date -d '2024-01-31 + 1 month' --rfc-3339=date # leap year
2024-03-02
1곳inc_dec_period
다음 중 하나입니다.
MINUTE | HOUR | DAY | WEEK | MONTH | YEAR
2tm
구조에는 최소한 다음 구성원이 포함됩니다.
int tm_sec seconds [0,61]
int tm_min minutes [0,59]
int tm_hour hour [0,23]
int tm_mday day of month [1,31]
int tm_mon month of year [0,11]
int tm_year years since 1900
int tm_wday day of week [0,6] (Sunday = 0)
int tm_yday day of year [0,365]
int tm_isdst daylight savings flag
3월에 대한 결과가 11보다 큰 경우 연도 필드도 1씩 증가합니다.
4 달력 시간을 나타내는 데이터 유형을 반환합니다mktime
. time_t
절대 시간 값으로 해석할 경우 epoch 1970-01-01 00:00:00 +0000(UTC) 이후 경과된 초 수를 나타냅니다.
답변2
3월 3일
"다음 달"은 같은 숫자로 한 달 앞으로 이동하는 것을 의미합니다. 따라서 1월 31일부터 시작하는 "다음 달"은 2월 31일이지만 이는 (손가락으로 세는 중...29, 30, 31) 3월 3일과 동일합니다. 윤년이면 3월 2일이다. 마찬가지로 3월 31일 + 한 달은 5월 1일입니다. 왜냐하면 4월 31일은 4월 말에서 단 하루만 쉬기 때문입니다.
# date --set '2023-01-31 12:00'
Tue Jan 31 12:00:00 PM UTC 2023
# date
Tue Jan 31 12:00:00 PM UTC 2023
# at midnight next month
warning: commands will be executed using /bin/sh
at Fri Mar 3 00:00:00 2023
at> echo foo
at> <EOT>
job 2 at Fri Mar 3 00:00:00 2023
마찬가지로 date
:
# date -d 'now + 1 month'
Fri Mar 3 12:01:32 PM UTC 2023
어쨌든 이것이 내 우분투 시스템에서 작동하는 방식입니다.
답변3
현재 날짜 이후 다음 달의 마지막 날을 얻으려면 date
현재 날짜를 현재 달의 말에서 멀리 떨어지게 하고(추가 월을 초과하지 않도록) date
두 달을 다시 점프하고 day부터 01까지, Go back one day를 갖습니다. 일방 통행 거리입니다.
편집: 첫 번째 릴리스는 다음 달이 현재 달보다 짧은 4개 날짜(12월 29~31일 및 7월 31일)에 실패했습니다.
$ date # To show where we are now.
Tue 29 Aug 16:29:44 BST 2023
$ echo | at "$( date -d "$( date '+%Y-%m-15' ) + 2 months" '+%Y-%m-01') - 1 day"
warning: commands will be executed using /bin/sh
job 73 at Sat Sep 30 16:29:00 2023
$ atq
73 Sat Sep 30 16:29:00 2023 a paul
%w
이 아이디어의 일부 확장은 (요일) 옵션을 사용하여 (예를 들어) 날짜를 매월 마지막 금요일로 이동할 수 있다는 것입니다 .