진정한“날짜 만”데이터 유형이없는 이유는 무엇입니까?


24

진정으로 "단지 하루"인 데이터 세트에 DateTime 값을 사용해야한다는 것은 엄청나게 실망했습니다. 생일이 가장 일반적인 예이지만 항상 비즈니스 응용 프로그램에서 나타납니다.

"날짜 전용"레코드의 시간 부분을 "정오"로 설정하는 데 익숙했습니다 (시간에 관계없이 날짜가 변경되는 것을 피함). 이것은 해킹처럼 보이며,이 문제를 극복하는 주니어 개발자의 버그를 영원히 발견하고 있습니다.

시간은 항상 고정 소수점을 기준으로합니다. 4PM은 자오선 또는 정오 이후 4 시간입니다. 태양에서 가장 높은 통과 지점을 관찰 할 수 있으며 좌표계를 설정할 수 있습니다. 정오 3 시간 전 (Ante Meridian), 정오 2 시간 후, 1970 년 1 월 1 일 이후 1441899402938 밀리 초. 이것은 데카르트 세계에서 자란 사람들에게 두 번째 본성입니다.

그러나 우리의 달력은 데카르트보다 오래되었습니다. 내 주장은 모듈로 함수가 적용되는 열거로보다 적절하게 생각된다는 것입니다. 월요일은 일요일을 따르며 일요일이 토요일을 따른다는 사실에 도달 할 때까지 계속됩니다. 양수와 음수가 없으며 모듈러스 또는 절대 값입니다.

몇 년 동안 반복됩니다. 365 일마다 생일, 기념일, 어린이 생일 등 몇 가지 특별한 날이 있습니다. 비즈니스 예약 응용 프로그램은 매월 7 일, 매월 첫 번째 화요일 등 회의의 예와 함께 발생합니다. 우리는 이것을 부동 소수점 숫자로 매핑 할 수 있으며, 실제로 이것을 숫자로 매핑하면 구식으로 실제로 어려운 많은 문제를 해결하지만 이것이 유일한 방법이라는 것을 의미하지는 않습니다.

DateTimes를 사용하여 Dates를 저장하는 "둥근 구멍의 스퀘어 페그"특성에 대한 인식과 이해로 인해 내 의견으로는 더 나은 프로그래머가 될 수 있습니다.

응용 프로그램에 Date 클래스를 정의 할 때 일정 응용 프로그램으로 명시 적으로 의도 된 값이 있습니까? 아니면 "모든 시간을 정오로 설정"하는 것이 가장 좋은 방법입니까? DateTime을 사용하고 Time 구성 요소를 정오로 설정하는 데 어떤 문제가있을 수 있습니까? 이러한 접근 방식으로 시간대 이동을 설명 할 수 있습니까? MomentJS를 사용했지만 더 나은 Date 클래스라고 생각합니다.


7
이것은 내가 생각하는 꽤 흥미로운 질문입니다. 생일 예제를 보자. 그것은 단지 인간에게만 의미가 있으며, 나는 한곳에서 살고 있으며 모두가 같은 시간에 일어납니다. 수학적으로 표현해야하는 즉시 매우 복잡해집니다. 교대 작업 시작 / 종료 시간 등 그들이 '작업중인 시간대에 하루의 시간'그들이 '시간'이 arent 같은 물건과 동일
이완

3
NodaTime (Date & Time의 C # 라이브러리)에는 날짜 유형이 있습니다.
코드 InChaos

5
시간을 UTC, 날짜 문제, 시간대 문제없이 저장하십시오.
Loren Pechtel

3
"그러나 신은 이것이 해킹처럼 보인다, 나는이 문제를 넘어 여행하는 주니어 개발자의 버그를 영원히 발견하고있다." -자신 만의 DateOnly 클래스 등을 만들고 하루 만 호출하면 어떨까요?
Brandin

5
@MichaelBlackburn 나는 심각하다. 설명은 비즈니스 규칙을 적용하는 자체 데이터 유형 (예 : 날짜 부분 만 정오로 설정하여 내부적으로 "DateTime"으로 저장할 수 있음)에 대한 상황을 정확하게 들리지만 원하는 부분 만 노출합니다 (월 , 일 등 년 / 년).
Brandin

답변:


15

우선, 하나의 길을 벗어 보자. 생일 은 한 가지, 생년월일 은 다른 것입니다. 생일 은 시간, 분 등의뿐만 아니라 구성 요소를 부족하지만 그것도 일년 구성 요소가 없기 때문에 이국적인 데이터 형식입니다. 생일을 실제로 다루고 싶다면 월 번호와 요일 번호 만 포함하고 내장 날짜-시간 데이터 유형과 관련이없는 자체 데이터 유형을 발명하는 것이 좋습니다.

반면에, 당신이 또한 출생 연도를 추적하고 싶다면, 당신이 가진 것은 생일이 아니며, 생년월일 입니다. 따라서 날짜 전용 데이터 유형이없는 이유는 이제 생년월일을 편리하게 표시 할 수 있도록하는 것입니다. 대신 인기있는 언어를 사용하면 시간 구성 요소도 포함하는 일부 유형을 사용해야합니다.

모든 프로그래밍 언어가 시간 구성 요소를 포함하는 시간적 데이터 유형 만 제공 한다는 것은 사실이 아니라고 간단히 언급하겠습니다 . RDBMS 및 해당 SQL 방언에서 날짜 전용 데이터 유형을 발견했습니다. 그러나 이는 부적절합니다. 이러한 데이터 유형이 존재한다고해서 데이터 유형이 좋은 것은 아니며 RDBMS는 스토리지와 표현을 혼동하는 오랜 역사를 가지고 있습니다.

시간이 좌표라는 것을 인식하는 순간에 그러한 날짜 전용 데이터 유형을 갖는 것이 왜 나쁜 생각인지 이해할 것입니다. 대부분의 사람들은 시간이 얼마인지에 대해 모호한 생각을 가지고 있으며,이 개념은 이러한 개념이 독점적으로 표현 된다는 사실을 깨닫지 않고 몇 년, 몇 달, 몇 일과 같은 신비한 문화 개념을 포함 합니다. 인간의 입력으로 시간. 실제 시간 입력 GUI 제어 아래의 모든 계층에서 시간은 일반적으로 시간 좌표로 표시되어야하며 이는 일부 원점 이후의 단일 시간 단위입니다.

예를 들어, DateTimeMicrosoft Dotnet 의 데이터 유형에서 시간 단위는 100 나노초이고 시간의 원점은 0001 년 1 월 1 일 자정 12시입니다.

비 독점적이고 독점적으로 표현되는 표기법의 다른 예는도,도,도, 도의 초를 사용한 각도 측정이다. 물론 유용한 계산을 수행하려면 내부적으로 라디안을 사용해야하며, 필요한 경우 인간 사용자와 상호 작용할 때 각도로 변환해야합니다.

따라서 사람이 읽을 수있는 측정 표현을 실제 측정 특성과 혼동하지 마십시오. 측정의 특성과 가장 일치하는 측정을 실현하기위한 이상적인 방법은 종종 사람이 읽을 수있는 측정의 표현과 매우 다릅니다.

이 모든 점에 비추어, 날짜 만 나타내는 시간적 데이터 유형에 대한 요청은 각도 만 표시 할 수있는 각도 데이터 유형에 대한 요청과 유사하므로 더 큰 정밀도를 명시 적으로 방지 할 수 없습니다. 이러한 데이터 유형은 유용한 정보를 얻기 위해 어쨌든 라디안으로 변환하거나 라디안으로 변환해야하기 때문에 매우 제한적이며 궁극적으로는 쓸모가 없습니다.

생년월일에 대한 당신의 문제는 당신이 부정확 한 시간 좌표 를 가지고 있다는 것 입니다. 물론 그 사람은 특정 순간에 태어 났지만 시간과 분은 병원에 의해 기록되지 않았거나 우리는 그렇지 않습니다. 그들에 대해 걱정하십시오. 따라서 실제로 일어나는 것은 날짜와 시간의 시간 좌표에 원하는 경우 오차 한계, 허용 오차 또는 불확실성 이 있으며이를 그대로 처리하는 것이 가장 좋습니다. 정확히 중간에 놓으십시오 +12 -12 시간의 불확실성을 암시합니다. 이것이 바로 여러분이 직관적으로 도달 한 솔루션입니다.


4
시간보다 오래된 개념 인 "일"에는 해당되지 않습니다. 그것들은 가장 적절하게 열거 또는 모듈러스로 생각됩니다. 일요일은 월요일 등을 따라 토요일까지 오는 일요일로 돌아갑니다. 정말 다른 것입니다.
Michael Blackburn

10
물론 대부분의 병원에서 표준 관행입니다 - 병원은 출생의 시간을 썼다. 그것은 전혀 문제가 아닙니다. 문제는 이벤트 (생일, 공휴일, 기념일 등)를 기념하기 위해 사람들이 1 일보다 더 나은 해결책을 사용하지 않거나 원한다는 것입니다. 생일이되었을 때 처음 만나는 사람에게 물어보십시오. 그들은 한 달과 하루를 줄 것입니다. 또한, 우리는 밀리미터, 킬로그램, 메가 와트, 실제로는 마이크로 패럿과 같이 항상 스케일을 포함하는 단위를 사용합니다.
Caleb

4
-1 : 모든 시간 사용이 단일 시점을 나타내는 것은 아닙니다. 생일은 그레고리력에서 월과 일로 표시되는 다른 아이디어입니다. "오늘 케빈의 생일인가요?" 답은 위치에 따라 다릅니다. 내가 시드니에 있다면 그것은 내 생일 일 수 있지만, 대신 호놀룰루에 있었다면, 아직 몇 시간은 없었을 것입니다.
kevin cline

6
@MikeNakis 결과는 넌센스가 아닌 마이크로 앰프입니다. 더 중요한 것은 1 초 또는 밀리 초가 아닌 날짜를 사용하는 경우 일반적으로 특정 시간이 아닌 하루 종일 (시간 기간) 에 대해 이야기 하는 것이며 상황에 따라 반복되는 이벤트 일 수 있습니다.
Caleb

4
OP는 생일에 대해 이야기하고 있었는데 정확히 java.util.MonthDay로 표시됩니다. 생일은 측정이 아니라 매년 반복되는 인간의 개념입니다. 한 시점으로 표현되지 않은 많은 인간의 시간 아이디어가 있습니다.
kevin cline

9

날짜와 시간은 상황에 따라 많은 것이 다르므로 모든 사용 사례를 다루기 위해서는 여러 가지 유형이 필요합니다.

DateTime여러 언어로 제공 되는 유형은 정확한 시점 ( "즉시")을 나타냅니다. 이 외에도 달력 일, 되풀이 날짜, 월, 년 등과 같이 많은 경우에 모호하고 상황에 따라 달라지는 상대적 또는 "인간적인"시간 및 시간 범위 개념이 많이 있습니다. 이러한 유형은 보편적으로 유용하지는 않지만 달력, 일정 도구 및 사람의 시간 개념과 상호 작용하는 기타 응용 프로그램과 같은 특정 응용 프로그램 도메인에서 필요합니다.

캘린더 앱과 같은 것을 작성 하는 경우 더 많은 시간 유형을 제공하는 Joda-time 과 같은 라이브러리를 사용하면 이점이 있습니다. 예를 들어 LocalDate시간이없는 날짜입니다. 이것은 DateTime시간 부분이 0으로 설정된 일반 과 다른 의미 를 갖습니다. DateTime여전히 특정 시간 지점 (특정 시간대의 자정)을 LocalDate나타내며 하루 종일 을 나타내며 특정 시간대 와 연결되어 있지 않기 때문입니다. 이것은 또한 하나를 직접 번역 할 수 없다는 것을 의미합니다.

LocalDateDateTime시간대를 고려할 필요 가 없기 때문에 확실히 간단 하지만 다른 문제를 알고 있어야합니다. 예를 들어 시간대를 넘어갈 때 현재 날짜가 실제로 뒤로 갈 수 있으며 같은 순간에 다른 시간대의 다른 날짜에 해당합니다. 네트워크 또는 웹 앱에서 현지 날짜를 사용하는 경우 이러한 문제에 매우주의해야합니다. 날짜에서 시간 부분을 제거해도 시간대의 근본적인 문제는 해결되지 않습니다! 역사적인 날짜와 다른 문화를 고려하면 줄리안 대 그레고리력과 같은 날짜가 시간에 따라 완전히 다른 경우에 해당 할 수 있기 때문에 훨씬 까다로워집니다.

이제 언어에 왜 LocalDate 내장 언어가 없는지 묻습니다 . 우선 SQL 및 Visual Basic과 같은 일부 언어에는 시간 부분이없는 날짜 유형이 있습니다. 그리고 Java는 LocalDate최신 버전 에도 추가했습니다 . 그러나 .Net과 같은 다른 플랫폼은 그렇지 않습니다. 언어 설계자 만이 이것이 표준 라이브러리에 포함되지 않은 이유에 실제로 대답 할 수 있지만, "일시적인 시간"은 개념적으로 간단하고 보편적으로 유용한 반면, 다른 시간 개념은 특정 응용 프로그램 도메인 (달력 등)에만 유용합니다. ). 따라서 응용 프로그램 개발자가보다 복잡한 사용 사례를 처리하기 위해 사용자 지정 형식을 작성하거나 타사 라이브러리 (예 : Joda-time)에서 처리하도록하는 것이 좋습니다.


5

진정으로 "단지 하루"인 데이터 세트에 DateTime 값을 사용해야한다는 것은 엄청나게 실망했습니다. 생일이 가장 일반적인 예이지만 항상 비즈니스 응용 프로그램에서 나타납니다.

아마도 캘린더는 복잡하고 여러 가지 방식으로 사용되어 아무도 간단하지는 않지만 많은 분야에서 유용 할 정도로 일반적인 클래스를 파악할 수 없었기 때문일 것입니다.

프로그래밍 언어에서 일반적으로 사용되는 날짜 유형은 컴퓨터 시스템에서 거래 날짜를 정확하게 지정하는 데 사용될 수 있습니다. 다른 유스 케이스에는 사용자 정의 라이브러리가 필요할 수 있습니다.

다음은 캘린더에 대한 간단한 사실 목록으로, 그 복잡성을 보여줍니다. 대부분은 역사적이므로 1.1.1970 이후의 날짜로주의를 제한하는 경우에는 이에 영향을받지 않습니다. 그러나 귀하의 신청서가 19 세기 후반에 발생한 날짜와 함께 작동해야하는 경우 이러한 사실이 중요합니다. 가능한 유스 케이스는 모든 종류 (책, 계보)의 과거 데이터베이스이지만 오늘날도 여전히 활동중인 대기업 또는 조직의 자산입니다.

이러한 모든 사실은 Julien Signolles가 작성한 OCaml 캘린더 라이브러리에 있는 우수한 FAQ 에서 인용됩니다 .

  1. 줄리안 달력은 기원전 45 년 Julius Caesar에 의해 소개되었습니다. 국가들이 그레고리오 력 (2.2 절)으로 바뀌기 시작한 1500 년대까지 일반적으로 사용되었다. 그러나 일부 국가 (예 : 그리스 및 러시아)에서는 1900 년대에이 언어를 사용했으며, 다른 정교회와 마찬가지로 러시아 정교회에서도 여전히 사용됩니다.

  2. 율리우스에서 그레고리력으로의 전환은 일정하게 발생하지 않았으며, 변경 연도에 따라 10 일에서 13 일이 삭제되었습니다. 예를 들어 프랑스에서 1582 년 12 월 9 일에 이어 1582 년 12 월 20 일에 이어 그리스에서 1924 년 3 월 9 일에 이어 1924 년 3 월 23 일이 이어졌습니다.

  3. 현대 시대에도 많은 달력 (그레고리 안, 정교회, 이슬람, 중국)을 사용하여 몇 가지를 인용합니다.

이제 일반적인 비즈니스 운영에 유용한 작업이 번들로 제공되는 날짜 유형을 원합니다. 나는 일반적인 사업 운영과 같은 것이 없다고 생각합니다. 예를 들어, 금융 세계에서는 다음을 계산해야합니다.

  1. 특정 기간 동안의 대출에 대한 실제이자를 계산하기 위해 이자율과 함께 사용되는 연도 비율 (예 : "6 개월"은 "0.5"에 해당)입니다. 이 분수를 계산하는 6 ~ 10 가지 레시피가 있으며 각각 윤년의 길이, 2 월 마지막 날에 대한 기간의 위치 및 한 달의 기간에 따라 다릅니다.

  2. 기념일을 계산할 때 기념일을 공휴일에서 업무 일로 옮기기 위해 비즈니스 캘린더와 규칙 (6 가지가 넘는 여러 규칙 중에서 선택된 규칙)을 사용합니다.

금융 업계에서 일하는 사람들에게는 이러한 기능과 규칙을 모두 구현하지 않는 캘린더 유형은 쓸모가 없습니다. 다른 많은 산업에는 일정에 대한 사용자 정의 계산이 필요한 다른 유형의 습관과 규칙이있을 수 있습니다.

응용 프로그램에 Date 클래스를 정의 할 때 일정 응용 프로그램으로 명시 적으로 의도 된 값이 있습니까? 아니면 "모든 시간을 정오로 설정"하는 것이 가장 좋은 방법입니까? DateTime을 사용하고 Time 구성 요소를 정오로 설정하는 데 어떤 문제가있을 수 있습니까? 이러한 접근 방식으로 시간대 이동을 설명 할 수 있습니까? MomentJS를 사용했지만 더 나은 Date 클래스라고 생각합니다.

달력 날짜를 추적해야 할 경우 가장 좋은 방법은 해당 날짜의 율리우스 일을 나타내는 큰 정수를 사용하는 것입니다. 년, 월, 달력으로 설명 된 줄리안 일에서 달력 일로 앞뒤로 변환하는 알고리즘은 널리 알려져 있으며 철저히 테스트되어 응용 프로그램에서 쉽게 구현할 수 있으며, 규칙에 관계된 규칙을 파악할 수 있습니다. 29 일 Februray에서 발생하는 이벤트의 기념일을 계산합니다.


2

위의 그의 대답에서 Mike Nakis는 일반적으로 시간이 절대적으로 측정 된 좌표와 그 시간 좌표의 다른 의사 소통, 상태 또는 지속성이 가정 된 시간 좌표의 추상적 표현 방법을 설명하는 것보다 더 나은 일을한다고 생각합니다.

당신은 요일을 언급 할 때 실제 시점의 모듈러스 종류의 표현으로 그러한 표현을 말합니다. 실제로는 그보다 다소 복잡합니다. 특정 시점에 요일을 반환하는 함수를 작성해야하는 경우 이러한 알고리즘에 대한 입력으로 필요한 다음 정보를 고려하십시오. 특정 시점, 달력, 시간대를 고려해야합니다 (유지 시간은 항상 변경되므로 유효 시간대가 특정 시간 좌표로 끝날 때 언제 시작했는지 알아야 함). 일광 절약 시간 제가 적용되면 시간이 지남에 따라 변경됩니다. 이제 현지 시간대로 DateTime을 받았다면

이 간단한 질문이 얼마나 복잡 할 수 있는지 알 수 있습니다.

경험이 부족한 개발자가 작성한 제품에 대한 방문 예약 응용 프로그램의 모든 버그를 수정하면서 어느 시점에서 신발에있을 때 느끼는 고통을 알고 있습니다. 모든 것은 폐기되어야했다.

시간은 실제로 좌표이지만 단순한 날짜 외에도 다음과 같이 필요할 수있는 다른 시간에 민감한 데이터를 고려하십시오.

지속 시간 : 특정 시간 좌표가 지정되지 않은 시간 길이 또는 시간 경과를 나타내는 밀리 초 범위입니다. 유스 케이스는 다음과 같습니다.

사용자로서 매주 수요일 자정 작업이 완료된 후 15 초 후에이 작업을 수행하고 싶습니다.

간격 : 두 특정 시간 좌표 사이의 시간 범위입니다. 간격을 고려할 수있는 유스 케이스.

사용자로서, 나는 매월 지정된 시간 간격 내에 완전히 포함 된 것을 볼 필요가 있습니다.

내가 원했던 또 다른 빠른 포인트는 시간 기반 데이터의 부동 소수점 숫자에 대해 의견을 작성했으며 이에 대해 조언하는 것입니다. 부동 소수점 산술은 필연적으로 반올림 오차를 유발하여 시간에 필요한만큼 정확한 측정을 제공하지 않을 수 있습니다.

결론적으로이 모든 정보는 필연적으로 다음과 같은 설계 고려 사항으로 이어집니다.

  • 특정 지점 또는 시간 범위는 UTC 또는 필요한 경우 UTC로 쉽게 추상화 할 수있는 충분한 정보가 포함 된 일부 데이터 유형으로 유지되어야합니다.
  • UTC 또는 UTC 좌표 범위를 최종 사용자가보다 이해하기 쉬운 표현 데이터 상태로 형식화하려면 응용 프로그램 논리를 작성해야합니다.
  • 중요한 지속 시간은 밀리 초 단위로 유지되어야합니다
  • 시간 관련 데이터 표시시 로케일 특정 또는 최종 사용자 환경 설정은 추가 데이터로 유지되고 표시 옵션처럼 처리되어야합니다. (예 : 키오스크 A, 중앙 시간대, 군사 시간 형식 또는 사용자 B 기본 설정, 텔 아비브 표준시 (GMT + 7 : 00) 시간대 등)
  • FP 번호를 피하십시오

1
이것 중 어느 것도 "피할 수없는"것은 아닙니다. 많은 응용 분야에서 일반적 일 수 있지만 Large Hadron Collider는 나노초 단위의 이벤트를 처리합니다. 밀리 초의 정밀도가 충분하지 않기 때문에 시스템 시간이 마이크로 초로 이동했습니다. 캘린더 앱에는 이벤트를 생성 한 시간대와 상관없이 현지 캘린더 날짜에 발생하는 날짜 개념이 있어야합니다.
Alan Shutko

1
@AlanShutko 그렇습니다. 필요한 "추가 데이터"는 현지 시간대, 요일 및 캡처해야하는 기타 중요한 데이터와 같은 것입니다. 그러나 특정 시점이 알고리즘에 중요하지 않은 경우에도 단일 시점에 대한 추상화입니다. 나노초 및 마이크로 초 단위까지 내 대답은 웹 및 LOB 유형 소프트웨어에 더 적합합니다. 선택한 LHC 언어가 C # 또는 Javascript인지 의심됩니다.
maple_shaft

1
밀리 초는 반복 가능한 물리적 프로세스에 좋습니다. 휴먼 액티비티의 경우 적절한 단위는 명목 일입니다. 예를 들어, 하루가 끝날 때 배송되는 경우 3 일 후에 목적지에서 사용할 수 있습니다.
케빈 클라인

과거에는 시간 좌표에 64 비트 부동 소수점 숫자를 사용하고 시간 범위에 대해 더 중요하게 생각했습니다. 정확한 손실이 실제로 중요하지 않은 큰 양뿐만 아니라 큰 정밀도로 소량을 표현할 수 있기 때문입니다. . (따라서 공룡이 6 천 5 백만 년 전에 죽었다면 몇 년을 주거나 몇 년이 걸렸을까요?) 그렇다면 왜 피해야한다고 말합니까?
Mike Nakis

Mike, 저는 10 진수에서 이진수로 변환 할 때 필연적으로 반올림하는 FP 수학에 관심이 있다고 생각합니다. 예를 들어 0.3은 이진 FP 숫자로 표현 될 때 반복되는 10 진수이므로 정확하게 표현할 수 없습니다. 용량이 빠진 것이 아니라 정밀도가 빠진 것은 아닙니다.
Michael Blackburn

2

즉, 대부분의 컴퓨터 기반 시간 유형은 시간 및 시간대 문제를 올바르게 처리하는 데 중점을 둡니다.

일반적인 접근 방식으로는 제대로 작동하지 않는 2 가지 경우가 있습니다. 현지 시간을 사용하여 일광 절약 시간제 변경의 다른 측면에있는 특정 시점을 설정하면 UTC에서 더 낮은 추상화 계층으로 변환 된 다음 1 시간 일찍 / 늦게 회의에 참석할 수 있습니다.

다른 하나는 질문에 따라 사람의 생년월일 기록과 같은 임의의 날짜 정보를 모델링하는 것입니다. 뉴질랜드와 하와이에서 두 사람이 동시에 태어난 경우를 상상해보십시오. 여권에 생년월일이 다를 가능성이 높으며 하와이에서 태어난 사람이 뉴질랜드로 이사하는 경우 정확히 같은 시간 동안 살았음에도 불구하고 뉴질랜드에서 태어난 사람보다 하루가 더 긴 것으로 간주됩니다.

날짜를 정오로 설정하는 질문에 대한 제안은 UTC가 작동합니다. UTC 오프셋의 범위는 -12에서 +14까지이므로 태평양에는이 방법이 실패 할 곳이 몇 군데 있습니다. 이 데이터 형식을 yyyymmdd 형식의 문자열로 취급하는 경향이 있으며 두 날짜 사이의 비교 계산을 수행 해야하는 경우 문자열 비교로 안전하게 수행 할 수 있습니다. 델타 비교를 수행 할 때 (예 : 날짜와 지금 또는 나이 X에 도달 할 때까지의 기간) 모든 날짜가 동일한 UTC 오프셋으로 작성되었는지 확인한 다음 표준 시간 함수를 사용하여 작업을 수행 할 수 있어야합니다.


3
" 나는 이러한 데이터 유형을 yyyymmdd 형식의 문자열로 취급하는 경향이 있으며 두 날짜 사이의 비교 계산을 수행해야하는 경우 문자열 비교로 안전하게 수행 할 수 있습니다. " Date데이터 유형 처럼 들리게 됩니다. aString
로스 패터슨

당신이 말했듯이, 날짜의 문자열 표현이며 원래 포스터와 달리 UTC + 13 시간대로 날짜가 변경되지 않습니다.
Michael Shaw

2

진정한“날짜 만”데이터 유형이없는 이유는 무엇입니까?

같은 이유로 DateTime 값은 일반적으로 UTC : 단순성신뢰성 으로 지정됩니다 . DateTime 값의 포인트는 표준 시간대, 일광 절약 시간제, 일정 및 기타 로컬 조정에 영향을받지 않는 단일 시점을 지정하는 것입니다. DateTime 값은 기간 또는 시간 집합이 아닌 하나의 순간 (유형 해상도의 한계까지)을 지정합니다. 이러한 제한으로 인해 DateTime 값을 신뢰할 수 있고 예측 가능하며 복잡하지 않은 방식으로 비교할 수 있습니다.

DateTime 값으로 날짜를 지정하는 것은 점을 사용하여 영역을 지정하는 것과 같습니다."이 점은 반지름이 100m 인 원의 중심을 나타냅니다"와 같은 규칙을 사용하여 해당 작업을 수행 할 수 있지만 많은 문제가 있습니다. 모두 같은 규칙을 사용해야합니다. 잘못된 유형으로 작업하는 것이 덜 고통 스럽도록 코드를 지원하므로 어느 시점에서 기존 영역보다 크거나 작은 영역을 지정해야합니다. 따라서 날짜가 있습니다 : 날짜를 지정하는 일반적인 시간으로 '정오'를 사용할 수 있지만 사람들은 UTC가 아닌 현지 시간으로 날짜를 지정하기 때문에 시간대를 사용합니다. DateTime을 사용하여 날짜를 지정하는 데 만족할만한 방법을 찾더라도 절대 날짜인지 또는 상대 날짜인지를 알기 위해서는 더 많은 정보가 필요합니다. 1776 년 또는 7 월 4 일마다? 다른 기간을 반복해서 사용하려면 어떻게합니까? 그리고 달력에는 모든 종류의 미친 문제가 있습니다. 어떤 달은 다른 달보다 길고, 몇 년은 다른 날보다 길며, 어떤 날은 다른 날보다 더 길며, 어떤 달력에는 공백이 있습니다. 동일한 문제가 더 짧은 기간 동안 발생하기 때문에 하루 종일 이러한 문제를 해결하고 싶지 않을 것입니다. "4 시간마다 1 알씩 복용"을 나타내는 코드를 " 그룹은 매주 금요일마다 만납니다. "

따라서 날짜 작업과 관련하여 많은 복잡한 문제가 있습니다. 특정 시점을 지정하고 숫자처럼 작업하는 유형을 제공하는 것은 상대적으로 쉽지만, 날짜가 사용되는 모든 방식을 다루는 유형을 제공하는 것은 매우 어렵습니다.

다른 사람들이 지적했듯이이 있는 날짜에 대한 좋은 지원을 제공 언어와 라이브러리, 그리고 그들이 정확히 바로 날짜 관련 코드를 얻을하는 것은 매우 어려운 주어진 사용하는 것이 좋은 아이디어입니다.


2
"날짜가 사용되는 모든 방식을 다루는 유형을 제공하기가 어렵습니다." 사실, 단일 유형을 제공하여 모든 것을 수행하는 것이 끔찍한 아이디어입니다. 첫 번째 Java 릴리스는 java.util.Date 만 제공했으며 결과는 끔찍했습니다. 그런 다음 복잡한 java.util.Calendar 계층 구조를 추가했는데 훨씬 나아지지 않았습니다.
케빈 클라인

1
@kevincline 완전히 동의합니다. OP는 언어를 지정하지 않았으므로 일반성을 목표로했습니다.
Caleb

" 같은 이유로, DateTime 값은 일반적으로 UTC로 지정됩니다 ." 그것은 2015 년이며, 저자의 시간대를 사용하여 많은 코드가 작성되고 있습니다 :-(
Ross Patterson

1
나는 날짜와 관련하여 일반적으로 받아 들여지는 협약이없는 이유가 정말로 궁금했습니다. "지역을 표현하기 위해 점을 사용하는 것"은 나의 좌절감을 완벽하게 요약합니다.
Michael Blackburn

2

진정한“날짜 만”데이터 유형이없는 이유는 무엇입니까?

다양한 언어의 다양한 라이브러리에는 이러한 유형이 많이 있습니다. 당신의 현재 언어에 대한 언어는 거의 확실합니다. Java util 패키지에는 시간 계산에 끔찍한 API가 있지만 java.time 패키지의 도입으로 인생이 훨씬 좋아졌습니다. 년-월-일 값을 포함하는 java.time.LocalDate 또는 월 및 일 수만 포함하는 java.time.MonthDay를 참조하십시오.


1

Calendrical 조작은 컴퓨팅에서 가장 잘 이해되지 않은 측면 중 하나입니다. 주제에 관한 모든 책이 쓰여졌습니다. @MichealBlackburn은 날짜 전용 데이터 유형을 요청하는 데 절대적으로 적합합니다. 날짜 전용 데이터 유형은 재 해석에 따라 타임 라인의 특정 지점으로 해석되지 않습니다. 역사적으로 날짜의 의미에 대한 합법적 인 분쟁이있었습니다. 그레고리력이 얼마나 복잡한지를 알아 내기 위해 그레고리력을 채택하는 것 이상을 보지 않아도됩니다. 또한, 서유럽과 그 식민지에서도 1 월 1 일부터 몇 년이 항상 시작된 것은 아닙니다 ( 예 : 영국과 영국이 3 월 25 일에 해를 시작했습니다).


1
맞습니다. 대답에서 인용하는 캘린더 FAQ는 성기 조작의 복잡성과 미묘함을 발견 할 수있는 훌륭한 자료입니다.
Michael Le Barbier Grünewald

-2

에 대한 답변 :

글쎄, 나는 거의 모든 언어가 왜 이것에 대해 하나의 데이터 유형만을 갖는지 알고 싶습니다.

가장 일반적인 이유는 "필요하지 않기 때문"일 수 있습니다. 시간, 분, 초 등을 신경 쓰지 않는 날짜 시간을 원하면 다음과 같이 초기화하십시오.

date = new DateTime(year, month, day, 0, 0, 0);

원하는 경우 DateTime을 직접 확장 할 수 있습니다.

public class Date extends DateTime {
    ...
    public Date(int year, int month, int day) {
        this(year, month, day, 0, 0, 0);
    }
}

참고 : 기본 시간과 시간대를 의도적으로 무시하고 있습니다. 그것들이 모두에 대해 동일하다면, 당신이 무엇을 설정했는지는 중요하지 않습니다 Date. UTC를 사례로 만들 수 있습니다. 서버가있는 시간대를 사용하여 사례를 만들 수 있습니다-어느 정도 부정확 한 값을 나타내는 데 중요하지 않다고 생각합니다 Date. 기본 시간과 동일-0으로 만들 수 있으며 정오로 만들 수 있습니다. 중요하지 않습니다. 페이스 북이 00:01에 생일 알림을 보내지 만 23:59에 태어났다면 정말 신경 쓰지 않으며 12 시간 이상 지났다는 기분이 상하지 않습니다.

위의 내용은 Java이지만 a DateTime및 상속이 있는 모든 언어에서 비슷하게 작동 합니다. Java는 실제로 이것을 해결하는 많은 방법을 가지고 있으며 위의 내용은 더 이상 사용되지 않습니다 ( Calendar지금 사용하기를 원합니다 ). 다른 사람이 의견에 게시하지만, 일부 언어는 실제로 않습니다 제공 Date바로 이러한 이유 때문에 아마도, 클래스를.

어쨌든 모든 Date구현은 아마도 언어의 래퍼 일뿐 DateTime이며 시간을 제로로 만듭니다. 그렇지 않으면 두 Dates / DateTimes 사이의 일 수와 같은 문제를 해결하기 위해 중복 코드가 필요합니다 (2 Date월 29 일과 3 월 1 일은 어떻습니까?). 이런 종류의 것들은 대개 DateTime수업 에서 해결됩니다 . 에 동일한 코드를 재사용하는 것이 Date좋습니다.


4
-1 : 년 + 월 + 일만 원하면 LocalDate를 사용하십시오. 해당 목적으로 DateTime을 사용하면 다른 프로그래머가 DateTime을보고 특정 시간을 나타내는 것으로 가정 할 때 버그가 발생합니다.
케빈 클라인

@ kevincline이 질문은 언어에 구애받지 않기 때문에 필요하다고 생각하지 않았습니다. 또한 "더 이상 사용되지 않음"으로 표시된 코드를 사용하는 것은 위험에 따라 사용하는 시나리오라는 것이 분명합니다. 더 중요한 것은, 나는 단지 뭔가의 예를 들어 당신이 언어가 어디 시나리오에서 할 수있는 사용 하지 않는 을 가지고 LocalDate, 또는 Date타입 클래스와 당신 '롤 - 네 - 자신의'에있다.
Shaz

1
그러나 시간에 대한 비즈니스 규칙과 관련된 명확하고 간결한 코드 (실제 시간과 반대되는)를 위해서는 "필수적"입니다. 라이브러리가 공칭 시간에 대한 유형을 제공하지 않으면 프로그래머가 해당 유형을 발명해야하며이를 수행하는 방법은 "DateTime"으로 시작하지 않습니다.
케빈 클라인

@ kevincline 코드가 덜 명확하거나 간결하다는 것을 알지 못합니다. 사이보기의 프로그래머의 관점에서 차이가 무엇 new Date(2000, 1, 1);new Date(2000, 1, 1);? 비어있는 시간, 분 및 초가 어느 쪽인지 알 수 있습니까? setMinutes ()와 같은 추가 함수가 표시되는 것을 걱정한다면 DateDateTime에서 상속하는 대신 랩 을 갖는 경로를 사용할 수 있으며 setYear, setMonth, setDay 등 만 노출시킬 수 있습니다. 사용중인 라이브러리의 DateTime보다 정확합니다.
Shaz

내 배경은 주로 C #이며 LocalDate와 유사한 구문이 없습니다. 우리는 단지 DateTime과 머들 사이를 지나친 것 같습니다.
Michael Blackburn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.