문제

모든 것을 GMT로 저장하시겠습니까?

오프셋이 포함되어 입력된 방식으로 모든 것을 저장하시겠습니까?

렌더링할 때마다 계산을 하시나요?

"1분 전" 상대 시간을 표시하시겠습니까?

도움이 되었습니까?

해결책

UTC로 저장해야 합니다. 그렇지 않으면 일광 절약 시간과 같은 기간 동안의 기록 보고 및 동작이...재미있는.GMT는 현지 시간이며 UTC를 기준으로 일광 절약 시간이 적용됩니다(그렇지 않음).

현지 시간을 저장하는 경우 다른 시간대에 있는 사용자에게 프리젠테이션을 제공하는 것은 정말 나쁜 일이 될 수 있습니다.원시 데이터가 UTC인 경우 로컬로 쉽게 조정할 수 있습니다. 사용자의 오프셋만 추가하면 작업이 완료됩니다!

Joel은 팟캐스트 중 하나에서 이에 대해 (둥근 방식으로) 이야기했습니다. 가능한 가장 높은 해상도로 데이터를 저장하세요 ('충실도'를 검색하세요), 다시 나갈 때 언제든지 뭉칠 수 있기 때문입니다.그렇기 때문에 UTC로 저장한다고 말하는 것입니다. 현지 시간은 해당 시간대에 있지 않은 사람을 위해 조정해야 하며 이는 많은 노력이 필요합니다.예를 들어 시간을 저장할 때 일광 절약 시간제가 적용되었는지 여부도 저장해야 합니다.수다.

과거에는 종종 데이터베이스에 정렬을 위한 UTC와 표시를 위한 현지 시간이라는 두 가지를 저장했습니다.이렇게 하면 사용자도 컴퓨터도 혼동하지 않습니다.

이제 다음을 표시합니다.물론, "3분 전" 작업을 수행할 수 있지만 UTC를 저장하는 경우에만 가능합니다. 그렇지 않으면 다른 시간대에 입력된 데이터가 "-4시간 전"으로 표시되어 사람들을 놀라게 할 것입니다.실제 시간을 표시하려는 경우 사람들은 현지 시간으로 표시하기를 좋아합니다. 데이터가 여러 시간대에 입력되는 경우 UTC를 저장하는 경우에만 쉽게 표시할 수 있습니다.

다른 팁

언제나 그렇듯이 대답은 "상황에 따라 다르다"입니다.

이는 시간으로 설명하는 내용과 데이터가 제공되는 방식에 따라 다릅니다.시간 값을 저장하는 방법을 결정하는 핵심은 시간대를 삭제하여 정보가 손실되는지 여부를 결정하고 사용자를 놀라게 하지 않는 것입니다.

UTC time_t로 데이터를 저장하면 확실한 이점이 있습니다. 이는 단일 int이므로 빠른 정렬과 쉬운 저장이 가능합니다.

문제는 다음과 같은 특정 영역으로 분류됩니다.

  1. 과거 데이터
  2. 미래, 단기 데이터
  3. 미래, 장기 데이터

각각에 다음과 같은 하위 클래스가 있습니다.

  1. 시스템 제공
  2. 사용자 제공

한 번에 하나씩 살펴보겠습니다.

시스템 제공:UTC로 시스템을 실행하는 것이 좋습니다. 그러면 시간대 문제를 방지할 수 있고 정보 손실도 발생하지 않습니다(항상 UTC임).

과거 데이터:이는 시스템 로그 파일, 프로세스 통계, 추적, 주석 날짜/시간 등과 같은 것입니다.데이터는 변경되지 않으며 시간대 설명자는 소급하여 변경되지 않습니다.이러한 유형의 데이터의 경우 제공된 시간대에 관계없이 UTC로 정보를 저장해도 정보가 손실되지 않습니다.따라서 시간대를 삭제하십시오.

미래, 장기 데이터:이는 먼 미래에 일어날 일이거나 계속 일어날 일입니다.충분히 오랫동안 유지되면 시간대 설명자가 변경되는 것이 보장됩니다.이러한 유형의 데이터의 좋은 예는 "주간 경영 회의"입니다.이는 한 번 입력하면 영구적으로 계속 작동할 것으로 예상되는 데이터입니다.이러한 값의 경우 시스템 제공인지 사용자 제공인지 확인하는 것이 중요합니다.사용자가 제공한 데이터의 경우 시간은 작성자의 시간대로 저장되어야 하며, 그렇지 않은 경우 정보가 손실됩니다.이러한 정보 손실은 시간대 정의가 변경되고 시간이 작성자에게 완전히 다른 값으로 표시될 때 명백해집니다!

Bwooce가 지적했듯이 제작자와 시청자가 서로 다른 시간대에 있기 때문에 약간의 혼란이 있습니다.이 경우 애플리케이션은 이전 위치에서 시간대 이동으로 인해 이동된 시간 값을 표시할 것으로 기대합니다.

미래, 단기 데이터:이는 빠르게 기록이 될 데이터이거나 짧은 기간 동안만 유효한 데이터입니다.예를 들면 간격 타이머, 등급 전환 등이 있습니다.이 데이터의 경우 값 생성과 기록 시간 사이에 정의가 변경될 가능성이 낮기 때문에 시간대를 삭제하는 것이 가능할 수도 있습니다.그러나 나는 이러한 가치들이 "미래, 장기 데이터"가 되는 나쁜 습관을 가지고 있다는 것을 발견했습니다.

시간대를 저장하기로 결정한 후에는 저장 방법에 주의를 기울여야 합니다.

  • 시간대를 오프셋이나 전체 설명자로 저장하지 마세요.

시간대를 오프셋으로 저장한 경우 시간대가 변경되면 어떻게 해야 합니까?시스템을 살펴보고 기존 데이터를 전면적으로 변경합니까?그렇게 하면 이제 역사적 가치가 부정확하게 된 것입니다.이 결함의 좋은 예는 Oracle과 iCal입니다.Oracle은 시간대 정보를 UTC와의 오프셋으로 저장하며 iCal에는 생성 시간대에 대한 전체 설명자가 포함되어 있습니다.

  • 이름으로 저장하세요.

이를 통해 기존 값을 수정하지 않고도 시간대 정의를 변경할 수 있습니다.시간대 데이터가 변경되면 생성된 인덱스가 유효하지 않을 수 있으므로 정렬이 더 어려워집니다.

개발자가 시간대에 관계없이 모든 것을 UTC로 계속 저장한다면 마지막 시간대 변경 배치에서 확인했던 문제가 계속해서 나타날 것입니다.

한 조직에서는 비서들이 일광 절약 시간제 이전에 팀의 달력을 인쇄하고 변경 후에 다시 인쇄해야 했습니다.마지막으로 두 가지를 비교하여 이동한 약속을 모두 다시 만들었습니다.물론 몇 번은 놓쳤고, 예전의 일광 절약 시간제가 도달하고 시간이 다시 정확해질 때까지 몇 주간의 고통이 있었습니다.

위의 Josh는 완전히 정확하지만 설명해야 할 한 가지 미묘한 경고가 있습니다.이는 향후 사건 및 시간대에 관한 정답이 없는 경우입니다.

반복되는 약속의 경우를 생각해 보자.이는 단순화를 위해 GMT 0000에 발생합니다. 이는 1200 NZST(뉴질랜드 표준시)이고 호주 시드니에서는 1000 AEST입니다.

한 구역에 일광 절약 시간제가 적용되면 약속은 어떻게 되나요?해야 할 일:

1a.TZ 변경이 약속의 "소유자"(누가 예약 한 사람)의 영역에 있다면 같은 책상 시계 시간 (예 : 오전 10시)에 머물려고합니까?
1b.TZ 변경이 다른 회의 참석자의 구역 중 하나에 있으면 변경 사항이 없습니다.

결과:소유자 TZ 변경으로 인해 예기치 않게 다른 모든 사람들에게 이동하지만 소유자와 관련하여 "오전 10시 회의"를 유지합니다.

'2.위와 같지만 반대입니다.

결과:회의 주최자를 위해 이동합니다(오전 10시 회의가 오전 9시 회의 또는 v/v가 됨). 이는 예상할 수 있지만 불편합니다.다른 참석자가 자신의 TZ 전환을 거칠 때까지 동일한 탁상 시계 시간으로 유지됩니다.

둘 다 완벽하지 않습니다.두 개의 약속이 있는 경우를 생각해 보십시오. 하나는 현지 시간으로 오전 10시에 A가 예약했고, 다른 하나는 A가 참석자로 예약되어 오전 9시에 발생했습니다.A와 B가 서로 다른 TZ에 있는 경우 DST 변경으로 인해 쉽게 이중 예약이 발생할 수 있습니다.

이 시점에서 당신의 마음이 약간 구부러져 있다면 나는 충분히 이해합니다.

이 예의 요점은 이러한 동작 중 하나를 올바르게 수행하려면 현지 시간의 UTC 버전뿐만 아니라 소유자가 예약할 때 있었던 TZ(오프셋이 아님)를 알아야 한다는 것입니다.그렇지 않으면 옵션 2를 선택할 수밖에 없으며 GMT 시간 이후 상황이 변경되었다는 사실을 누구에게도 알리지 않고 조용히 프레젠테이션만 변경됩니다...그렇죠?(아니요, 이것은 함정입니다. 오전 10시 회의가 저절로 진행될 때 프레젠테이션이 중요합니다.)

이 통찰력을 얻은 것은 동료이자 친구인 Jason Pollock의 공로입니다.읽다 여기서 그의 견해, 그리고 후속 논의 iCal 및 VTIMEZONE 여기.

모든 것을 GMT/UTC로 저장하는 것이 나에게는 가장 논리적인 것 같습니다.그런 다음 원하는 모든 시간대의 날짜와 시간을 표시할 수 있습니다.

몇 가지 사항:

  1. 시간이 벽 시계 시간으로 만 지정되고 이것이 주요 표현이라면 절대적으로 지정된 시간이 아닙니다.GMT 표현으로이를 변환해야합니다.예를 들어매일 오전 9시.다시 말해서:지금은 (날짜)시간이 아닙니다.
  2. 향후 약속 날짜와 시간을 저장하면 입력 시간대와 시간 자체의 순간.그래서 그것이 겨울에 여름에 약속이라면 예를 들어서유럽, 그것은 +2 : 00이며, 정상 (겨울) 오프셋은 +1 : 00입니다.이것은 Bwooce가 언급 한 캘린더 문제를 해결할 것입니다.
  3. 물론 특정 시간대에서 날짜와 시간으로 다시 변환 할 때 GMT로 변환하는 동안 오른쪽 오프셋을 사용하는 것과 동일하게 적용됩니다.

운 좋게도 올바르게 사용하면 (.NET) DateTime 유형이 달력 유지와 관련된 모든 세부 사항을 처리합니다.당신과 이 모든 것은 그것이 어떻게 작동하는지 알면 매우 쉬울 것입니다.

개인적으로 모든 것을 GMT로 저장한 다음 사용자의 현지 시간대를 사용하여 관련 시간을 표시하지 않을 이유가 없습니다.

상대 시간을 표시하고 싶다면 분명히 시간이 필요하고 번역을 해야 하지만, 번역을 하고 싶다면 GMT가 여전히 최선의 선택이라고 생각합니다.

그래서 MSSQL 서버로 약간의 실험을 진행했습니다.

테이블을 생성하고 현재 현지화된 시간대(호주)가 포함된 행을 추가했습니다.그런 다음 날짜 시간을 GMT로 변경하고 다른 행을 추가했습니다.

해당 행이 약 10초 간격으로 추가되었더라도 SQL 서버에는 10시간 간격으로 표시됩니다.

다른 것이 없다면 적어도 날짜를 일관된 방식으로 저장해야 한다는 사실을 알려주므로 GMT로 저장해야 한다는 주장에 무게가 더해집니다.

MS Dynamics는 GMT를 저장한 다음 사용자 수준에서 GMT를 기준으로 시간대를 파악합니다.그런 다음 해당 시간대에 항목이 표시됩니다.

MS에서 꽤 큰 그룹이기 때문에 그것을 밖으로 던져야겠다고 생각했고 이것이 그들이 그것을 처리하기로 결정한 방법입니다.

나는 모든 것을 시간대와 함께 저장하는 것을 선호합니다.클라이언트는 나중에 어떤 방식으로 표시할지 결정할 수 있습니다.제가 가장 좋아하는 변환 라이브러리는 PostgreSQL-데이터베이스.

여기를 보십시오. w3c는 질문에 대한 답변을 훌륭하게 수행했습니다.

사용 사례를 살펴보세요.

http://www.w3.org/TR/timezone/

날짜 시간을 GMT가 아닌 UTC로 저장하는 것이 좋습니다. GMT에는 일광 절약 시간이 적용됩니다.

나는 GMT로 저장하고 상대값("약 10초 전", "5개월 전")만 표시하는 것을 좋아합니다.대부분의 사용 사례에서는 사용자가 실제 타임스탬프를 볼 필요가 없습니다.

확실히 예외가 있으며 개별 애플리케이션에는 그 중 많은 예외가 있을 수 있으므로 '단방향' 답변이 될 수 없습니다.강력한 감사 능력이 필요한 것(예:투표), 시간이 담론 영역(천문학, 과학 연구)의 일부인 시스템에서는 사용자에게 실제 타임스탬프를 표시해야 할 수도 있습니다.

하지만 대부분의 앱은 간단한 상대 시간을 사용하면 이해하기가 더 쉽습니다.

저는 보통 Unix 시간을 사용합니다.반드시 미래에 안전한 것은 아니지만 꽤 잘 작동합니다.

항상 GMT(또는 UTC)로 저장하세요.여기에서 현지 표준 시간대로 쉽게 변환할 수 있습니다.

날짜는 사용자가 제공한 데이터가 아닌 한 UTC로 저장되어야 하며 사용자가 해당 데이터를 어떤 시간대에 두려고 했는지 알 수 없습니다.때로는 (아주 아주 드물게) 사용자에게 다시 알려줄 수 있도록 시간대 없이 시, 분, 초, 일, 월, 연도 구성 요소를 저장해야 하는 경우가 있습니다.이제 새로운 개발자이거나 확실하지 않은 경우 UTC를 저장하면 99% 정확합니다.

그러나 이것이 항상 모든 경우에 100% 작동한다고 믿으면 속지 마십시오.그렇지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top