복붙노트

반복 날짜를 기억하는 방법 일광 절약 시간제

PHP

반복 날짜를 기억하는 방법 일광 절약 시간제

데이터베이스에 이벤트를 저장하고 있습니다. 나는 '시작'과 '종료'날짜 시간, 'tickets_start'및 'tickets_end'(티켓 판매가 실제로 시작 / 끝날 때 - 실제 이벤트의 시작 / 끝과 반대)를 가지고 있습니다.

지금까지 필자는 저장하기 전에 날짜 / 시간을 GMT로 변환 한 다음 표시를 위해 각각의 시간대로 돌아가는 것과 같은 재미있는 모든 작업을 수행하는 메서드를 작성했습니다.

"America / New_York"와 같은 값을 가진 varchar 필드에 시간대를 저장합니다.

하지만 이제 사용자가 반복 이벤트를 허용하려는 경우에 대비해야합니다. 나는 전에 그것을 해봤지만, 그다지 큰 거래는 아니지만, 여러 시간대에 걸쳐서는 ​​결코하지 않습니다.

처음에는 그다지 큰 문제가 아닐 것이라고 생각했지만, 초기 시작 날짜가 7 월 (예)이었고 1 년 동안 매월 반복되는 경우 일광 절약 시간으로 인해 그리니치 표준시와의 변환은 시간이 다르게 변경됩니다. 한 달, 12시를 변환하면 -5로 변경되고 다음은 DST로 인해 -4로 변경됩니다.

나의 현재 생각은 DST 동안 시작 / 끝 날짜가 입력되었는지 여부에 대한 'dst'tinyint (1)를 저장하고 필요한 경우 시간을 한 시간 씩 변경하는 메서드를 만드는 것입니다.

그러나 나는 생각하기에 이것에 대한 "정상적인"또는 생각하기 쉬운 것 같은데 희망을 가지고 여기에 묻겠다.

(cakephp 2.4.x)

해결법

  1. ==============================

    1.첫째, 현대 용어에서 GMT 대신 UTC라고해야합니다. UTC가보다 정확하게 정의된다는 것을 제외하고는 대부분 동일합니다. GMT라는 용어는 영국의 시간대 중 오프셋 UTC + 0을 갖는 겨울 개월 동안 적용되는 부분을 나타냅니다.

    첫째, 현대 용어에서 GMT 대신 UTC라고해야합니다. UTC가보다 정확하게 정의된다는 것을 제외하고는 대부분 동일합니다. GMT라는 용어는 영국의 시간대 중 오프셋 UTC + 0을 갖는 겨울 개월 동안 적용되는 부분을 나타냅니다.

    이제 질문에. UTC가 반드시 모든 날짜 및 시간 값을 저장하는 가장 좋은 방법은 아닙니다. 그것은 과거의 사건들 또는 미래의 절대 사건들에 대해 특히 잘 작동하지만, 미래의 지역 사건, 특히 미래의 사건들에 대해서는 그렇게 잘 작동하지 않습니다.

    나는 최근에 또 다른 대답에 대해 썼다. 그리고 현지 시간이 UTC보다 더 좋은 몇 가지 예외 사례 중 하나이다. 주요 논쟁은 "알람 시계 문제"입니다. 알람 시계를 UTC로 설정하면 DST 전환 당일에 일찍 또는 늦게 깨어날 수 있습니다. 이것이 대부분의 사람들이 현지 시간으로 자명종을 설정하는 이유입니다.

    물론 전 세계의 데이터로 작업하는 경우 현지 시간을 저장할 수 없습니다. 몇 가지 다른 점을 저장해야합니다.

    마지막 두 시간 동안, 해당 시간대를 담당하는 정부가 변경을 결정하면 모든 현지 날짜 / 시간에 해당하는 UTC가 변경 될 수 있음을 이해하십시오. 매년 여러 개의 표준 시간대 데이터베이스 업데이트가 있으므로 업데이트 공지에 가입하고 표준 시간대 데이터베이스를 정기적으로 업데이트 할 계획이 필요합니다. 시간대 데이터를 업데이트 할 때마다 향후 모든 이벤트에 대해 UTC 해당 시간을 다시 계산해야합니다.

    둘 이상의 시간대에 걸친 모든 종류의 이벤트 목록을 표시하려는 경우 UTC에 해당하는 항목이 중요합니다. 그것들은 그 목록을 만들기 위해 쿼리 할 값입니다.

    고려해야 할 또 다른 포인트는 DST 폴백 전환 중에 발생하는 로컬 시간에 이벤트가 예약 된 경우 이벤트가 첫 번째 인스턴스 (일반적으로) 또는 두 번째 인스턴스 (때로는)에서 발생하는지 여부를 결정해야합니다. 또는 둘 다 (드물게), 응용 프로그램에 원하는 이벤트가 두 번 발생하지 않도록하는 메커니즘을 구축하십시오.

    당신이 간단한 대답을 찾고 있다면 - 미안하지만, 하나도 없습니다. 시간대에 따라 미래의 이벤트를 스케줄하는 것은 복잡한 작업입니다.

    몇 사람들이 나에게 UTC 시간을 사용하여 일정을 잡는 기술을 보여주었습니다. 즉, 현지 시간으로 시작 날짜를 선택하고이를 UTC로 변환하여 저장하고 시간대 ID도 저장한다는 것입니다. 그런 다음 런타임에 시간대를 적용하여 원래 UTC 시간을 로컬 시간으로 다시 변환 한 다음 해당 로컬 시간을 사용하여 마치 원래 위와 같이 저장된 다른 재발을 계산합니다.

    이 기술이 작동하는 동안 단점은 다음과 같습니다.

  2. from https://stackoverflow.com/questions/19626177/how-to-store-repeating-dates-keeping-in-mind-daylight-savings-time by cc-by-sa and MIT license