월이 상대 날짜로 끝날 때 at은 어떻게 동작합니까?

월이 상대 날짜로 끝날 때 at은 어떻게 동작합니까?

1월 31일에 사용하면 어떤 성능을 발휘하나요 at midnight next month? 3월 4일인가요, 아니면 2월 28일인가요? 아니면 3월 31일인가요?

답변1

이 답변의 목적은 귀하가 이미 받은 다른 (올바른) 답변을 보완하고 몇 가지 추가 기술 정보를 제공하는 것입니다.

at명령이 명령을 받을 때NEXT <inc_dec_period>1 , 현재 날짜를 시간 구조로 사용( struct tm2 )지정된 기간에 "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이 아이디어의 일부 확장은 (요일) 옵션을 사용하여 (예를 들어) 날짜를 매월 마지막 금요일로 이동할 수 있다는 것입니다 .

관련 정보