일광 절약 시간을 염두에 두고 반복되는 날짜를 저장하는 방법
데이터베이스에 이벤트를 저장하고 있습니다.'시작' 및 '종료' 날짜 시간, 'tickets_start' 및 'tickets_end'(실제 이벤트의 시작/종료와 달리 티켓 판매가 실제로 시작/종료되는 경우)가 있습니다.
지금까지 저는 저장하기 전에 날짜/시간을 GMT로 변환한 후 각각의 시간대로 되돌려 표시하는 방법을 개발했습니다.
시간대를 "America/New_York"와 같은 값으로 varchar 필드에 저장합니다.
그러나 - 이제 사용자가 반복 이벤트를 허용하려면 처리를 시작해야 합니다.전에도 해봤는데 그렇게 큰 문제는 아니지만 여러 시간대를 넘긴 적은 없어요.
처음에는 대수롭지 않다고 생각했지만, (예를 들어) 첫 번째 시작일이 7월이고, 매달 1년씩 반복된다면, 어느 시점에 서머타임이 GMT로부터의 변환으로 시간을 다르게 바꿀 수 있다는 것을 깨달았습니다.1개월 후에는 12:00를 변환할 때 -5로 변경되고 다음 달에는 DST를 위해 -4로 변경됩니다.
현재 생각으로는 DST 중에 시작/종료일이 입력되었는지 여부를 나타내는 'dst' tinyint(1)를 저장한 후 필요에 따라 시간을 1시간 변경하는 방법을 만들 생각입니다.
하지만, 이것에 대한 「정상」이나, 내가 생각하고 있지 않은 간단한 것이 있을지도 모른다는 희망을 가지고, 여기에 묻고 싶다.
(cakephp 2.4.x)
첫째, 현대 용어로는 GMT 대신 UTC라고 해야 합니다. UTC가 더 정확하게 정의되어 있다는 점을 제외하고는 대부분 동일합니다.GMT라는 용어는 UTC+0 오프셋이 있는 동절기 동안 유효한 영국 표준 시간대 부분을 참조하기 위해 예약합니다.
이제 질문으로 넘어가겠습니다.UTC가 모든 날짜 및 시간 값을 저장하는 최선의 방법은 아닙니다.특히 과거 이벤트나 미래의 절대 이벤트에는 효과가 있지만 미래의 지역 이벤트, 특히 미래의 반복 이벤트에는 그다지 효과가 없습니다.
저는 최근에 다른 답변에 대해 썼는데, UTC보다 현지 시간이 더 말이 되는 몇 안 되는 예외 사례 중 하나입니다.주요 인수는 "알람 클럭 문제"입니다.UTC까지 알람클럭을 설정하면 DST 이행일에 1시간 일찍 또는 늦게 기상합니다.이것이 대부분의 사람들이 현지 시간으로 알람시계를 맞추는 이유이다.
물론, 전 세계의 데이터를 사용하고 있는 경우는, 현지 시간만을 보존할 수 없습니다.몇 가지 다른 내용을 저장해야 합니다.
- 반복 이벤트의 현지 시간(예: "08:00")
- "America/New_York"와 같이 현지 시간이 표현되는 시간대
- 반복 패턴은 매일, 격주, 매월 셋째 목요일 등 어떤 형식으로든 응용 프로그램에 적합합니다.
- 가장 적합한 UTC 날짜 및 시간과 동등한 다음 UTC 날짜.
- 미래 이벤트 UTC 날짜 및 시간 목록은 미리 정의된 기간을 미래로 예상할 수 있습니다(필요에 따라 1주일, 6개월, 1년 또는 2년).
마지막 2개의 경우 해당 시간대를 담당하는 정부가 변경을 결정한 경우 현지 날짜/시간과 동등한 UTC가 변경될 수 있음을 이해하십시오.표준 시간대 데이터베이스 갱신은 매년 여러 번 이루어지기 때문에 갱신 안내에 등록하고 표준 시간대 데이터베이스를 정기적으로 갱신할 계획을 세워야 합니다.시간대 데이터를 업데이트할 때마다 향후 모든 이벤트의 UTC 등가 시간을 다시 계산해야 합니다.
여러 타임존에 걸친 모든 종류의 이벤트목록을 표시할 예정이라면 UTC에 대응하는 것이 중요합니다.해당 목록을 작성하기 위해 조회할 값입니다.
고려해야 할 또 하나의 포인트는 이벤트가 DST 폴백 이행 중에 발생하는 로컬 시간으로 스케줄 되어 있는 경우 이벤트가 첫 번째 인스턴스(통상은) 또는 두 번째 인스턴스(경우에 따라서는) 또는 두 번째 인스턴스(희박) 중 어느 쪽에서 발생하는지 판단하고 y가 아닌 한 이벤트가 두 번 발생하지 않도록 하는 메커니즘을 애플리케이션에 내장해야 한다는 것입니다.그러고 싶겠지
만약 당신이 간단한 답을 찾고 있다면-죄송합니다만, 그것은 없습니다.표준 시간대에 걸쳐 향후 이벤트를 스케줄링하는 것은 복잡한 작업입니다.
대체 어프로치
UTC 시간을 스케줄에 사용하는 기술을 몇 명 소개해 드렸습니다.즉, 현지 시간으로 시작 날짜를 선택하고 UTC로 변환하여 저장하며 시간대 ID도 저장합니다.그런 다음 런타임에 시간대를 적용하여 원래 UTC 시간을 로컬 시간으로 변환한 다음 해당 로컬 시간을 사용하여 위에 저장된 것처럼 다른 반복을 계산합니다.
이 기술은 기능하지만 다음과 같은 단점이 있습니다.
첫 번째 인스턴스가 실행되기 전에 로컬 시간을 변경하는 표준 시간대 업데이트가 있는 경우 전체 일정이 취소됩니다.이는 "첫 번째" 인스턴스의 과거 시간을 선택하여 두 번째 인스턴스가 실제로 첫 번째 인스턴스가 되도록 함으로써 완화할 수 있습니다.
시간이 실제로 사용자를 따라다녀야 하는 "부동시간"인 경우(휴대전화 알람시계 등), 원래 생성된 존에 대한 시간대 정보를 저장해야 합니다(실행하려는 존이 아니더라도).
이로 인해 복잡성이 가중되지만 아무런 이점도 없습니다.UTC 전용 스케줄러를 사용하고 있는 경우, 타임 존의 서포트를 리터치 하는 경우를 위해서, 이 테크닉을 예약합니다.
언급URL : https://stackoverflow.com/questions/19626177/how-to-store-repeating-dates-keeping-in-mind-daylight-savings-time
'programing' 카테고리의 다른 글
PDO 준비 스테이트먼트에서 콜론(:) 이스케이프 (0) | 2022.10.04 |
---|---|
휴지 상태에서는 hibernate_sequences 테이블을 생성할 수 없습니다. (0) | 2022.10.04 |
.then() 체인으로 이전 약속 결과에 액세스하려면 어떻게 해야 합니까? (0) | 2022.09.28 |
mariadb: jdbc: setTimestamp가 밀리초를 잘라냅니다. (0) | 2022.09.28 |
PHP 네임스페이스 및 "사용" (0) | 2022.09.28 |