'at'은 시간이 언제 변하는지 어떻게 알 수 있나요?

'at'은 시간이 언제 변하는지 어떻게 알 수 있나요?

at어제 새벽 2시 40분쯤 우연히 여기저기 돌아다니고 있었습니다. (묻지 마세요...) (테스트 삼아) 잠시 후에 이벤트 일정을 잡아 보려고 했는데, - 그냥 안 됐어요. 이벤트는 이미 대기열에 있었지만 2시 41분이 되자 아무 일도 일어나지 않았습니다. 나는 포기하고 잠자리에 들었다.

무슨 일이에요? 음 – 오늘 노르웨이에서 일광 절약 시간이 끝나는 것으로 밝혀졌습니다. 따라서 오늘 밤 2시 41분은 두 번 발생합니다! 물론이죠.두번째한 번(예: 여름철 3시 41분) at그런 다음 예정된 이벤트를 시작합니다.

어떻게 작동하나요? 스케줄러가 시간 변경을 인식하고 지정된 시간이 지났을 때만 실행하는 대신 두 번째 시간을 선택하는 이유와 방법은 무엇입니까?

답변1

atmktime()주어진 날짜와 시간을 구문 분석하고 일광 절약 시간을 -1(사용할 수 없음, 자동 감지)로 설정하여 실행해 보세요.

at소스 코드:

  tm1.tm_isdst = -1;
  t = mktime (&tm1);

man 3 mktime:

tm_isdst 필드에 지정된 값은 tm 구조에 제공된 시간 동안 일광 절약 시간(DST)이 적용되는지 여부를 mktime()에 알려줍니다. 양수 값은 DST가 적용됨을 의미하고, 0은 음수 값이 적용되지 않음을 의미합니다. mktime()이 (시간대 정보 및 시스템 데이터베이스를 사용하여) 지정된 시간에 DST가 적용되었는지 확인하려고 시도해야 함을 의미합니다.

mktime() 함수는 tm 구조의 필드를 다음과 같이 수정합니다. [...] tm_isdst는 (초기값에 관계없이) 각각 양수 값 또는 0으로 설정되어 지정된 시간에 DST가 적용되는지 여부를 나타냅니다. .

따라서 mktime()DST가 유효한지 여부에 대한 결정이 내려지며 가능한 두 가지 옵션 중 나중 날짜를 선호하는 것 같습니다(해당 결정이 어떻게 내려지는지는 문서에서 명확하지 않지만).

at그런 다음 UNIX 타임스탬프(1970년 1월 1일 이후의 초 수)로 변환됩니다. 이것을 갖고 나면 더 이상 변경할 시간이 없습니다. 시계를 한 시간씩 앞뒤로 조정하면 시간에 대한 인간의 표현만 변경되거나 시간대 이후의 초 수나 작업이 실행되기 전의 초 수는 변경되지 않습니다.


(테스트 차원에서) 1분 후에 이벤트를 예약해 보았습니다.

그런데 next minute시간 변경 여부에 관계없이 다음 1분에 실행되는 유사한 표현식을 사용할 수 있습니다.

관련 정보