문제

누군가가 현재의 "모범 사례"를 조언 할 수 있습니까? Date 그리고 Calendar 유형.

새 코드를 작성할 때는 항상 호의를 베풀는 것이 가장 좋습니다. Calendar ~ 위에 Date, 또는 상황이 어디에 있습니까? Date 더 적절한 데이터 유형입니까?

도움이 되었습니까?

해결책

날짜는 더 간단한 클래스이며 주로 후진 호환성 이유로 있습니다. 특정 날짜를 설정하거나 산술 날짜를 설정 해야하는 경우 캘린더를 사용하십시오. 캘린더는 또한 현지화를 처리합니다. 이전 날짜 조작 기능은 이후 더 이상 사용되지 않았습니다.

개인적으로 나는 선택이있을 때 밀리 초의 시간을 길이 (또는 적절한) 또는 달력으로 사용하는 경향이 있습니다.

날짜와 캘린더는 모두 변경 가능하며 API에서 사용할 때 문제를 제시하는 경향이 있습니다.

다른 팁

새 코드를위한 가장 좋은 방법 (정책이 타사 코드를 허용하는 경우)은 조다 타임 라이브러리.

둘 다, 날짜 그리고 달력, 새로운 코드에 대한 좋은 솔루션이 아니기 때문에 많은 설계 문제가 있습니다.

  • Date 그리고 Calendar 실제로 동일한 기본 개념입니다 (둘 다 시간에 즉시 그리고 근본적인 주위의 포장지입니다 long 값).

  • 하나는 그것을 주장 할 수 있습니다 Calendar 실제로는 훨씬 더 깨졌습니다 Date 요가와 시간과 같은 것들에 대한 구체적인 사실을 제공하는 것처럼 보이지만, 당신이 그것을 바꾸는 경우 timeZone 속성, 콘크리트는 Blancmange로 변합니다! 아무도 상점으로 유용하지 않습니다 연말 또는 시간 이런 이유로.

  • 사용 Calendar 주어진 경우 계산기로만 Date 그리고 TimeZone 객체, 계산을 수행합니다. 애플리케이션에서 속성 타이핑에 사용을 피하십시오.

  • 사용 SimpleDateFormat 함께 TimeZone 그리고 Date 디스플레이 문자열을 생성합니다.

  • 모험적인 사용을 느끼고 있다면 Joda-Time은 불필요하게 복잡한 IMHO이며 곧 JSR-310 날짜 API에 의해 대체 될 것입니다.

  • 나는 전에 자신의 것을 굴리는 것이 어렵지 않다고 대답했다. YearMonthDay 사용하는 클래스 Calendar 날짜 계산 후드 아래. 나는 제안을 위해 다운 투자를했지만 여전히 그것이 유효한 것이라고 믿는다. 조다-시간 (그리고 JSR-310)는 대부분의 유스 케이스에 대해 너무 과도하게 복잡합니다.

날짜는 날짜 개체를 저장하는 데 가장 좋습니다. 그것은 지속 된 것, 직렬화 된 것입니다 ...

캘린더는 날짜 조작에 가장 적합합니다.

참고 : 날짜는 변이 가능하므로 스레드 안전이 아니기 때문에 때때로 날짜보다 Java.lang.long을 선호합니다. 날짜 개체에서 settime () 및 gettime ()을 사용하여 둘 사이를 전환하십시오. 예를 들어, 애플리케이션의 일정한 날짜 (예 : 0 1970/01/01 또는 2099/12/31로 설정 한 적용 END_OF_TIME; 특히 시작 시간 및 종료 시간으로 널 값을 대체하는 데 매우 유용합니다. SQL은 Nulls에 특이한 것처럼 데이터베이스에서 유지하면 데이터베이스에서 유지할 때).

나는 일반적으로 가능한 경우 날짜를 사용합니다. 변이 가능하지만 돌연변이 체는 실제로 더 이상 사용되지 않습니다. 결국 그것은 기본적으로 날짜/시간을 나타내는 오래 걸립니다. 반대로, 값을 조작 해야하는 경우 달력을 사용합니다.

당신은 이런 식으로 생각할 수 있습니다 : 당신은 stringbuffer 만 사용하여 쉽게 조작 할 수있는 문자열이 필요할 때만 ToString () 메소드를 사용하여 문자열로 변환합니다. 같은 방식으로 시간 데이터를 조작 해야하는 경우에만 달력을 사용합니다.

모범 사례를 위해, 나는 불변의 물체를 가능한 한 밖에서 사용하는 경향이 있습니다. 도메인 모델. 부작용의 가능성을 크게 줄이고 Junit 테스트가 아닌 컴파일러에 의해 수행됩니다. 이 기술을 작성하여 사용합니다 개인 결승 수업의 필드.

그리고 StringBuffer 비유로 돌아옵니다. 다음은 캘린더와 날짜 사이를 변환하는 방법을 보여주는 몇 가지 코드입니다.

String s = "someString"; // immutable string
StringBuffer buf = new StringBuffer(s); // mutable "string" via StringBuffer
buf.append("x");
assertEquals("someStringx", buf.toString()); // convert to immutable String

// immutable date with hard coded format.  If you are hard
// coding the format, best practice is to hard code the locale
// of the format string, otherwise people in some parts of Europe
// are going to be mad at you.
Date date =     new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH).parse("2001-01-02");

// Convert Date to a Calendar
Calendar cal = Calendar.getInstance();
cal.setTime(date);

// mutate the value
cal.add(Calendar.YEAR, 1);

// convert back to Date
Date newDate = cal.getTime();

// 
assertEquals(new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH).parse("2002-01-02"), newDate);

Dates는 불변의 지점으로 사용되어야합니다. CalendarS는 변이 가능하며 다른 클래스와 협력하여 최종 날짜를 제시 해야하는 경우 통과 및 수정할 수 있습니다. 그것들과 유사하다고 생각합니다 String 그리고 StringBuilder 그리고 내가 어떻게 사용되어야한다고 생각하는지 이해할 것입니다.

(그렇습니다. 날짜는 실제로 기술적으로 불변 할 수 없다는 것을 알고 있지만, 의도는 그것이 변하지 않아야한다는 것입니다.

tl; dr

주변의 현재 "모범 사례"를 조언하십시오 Date 그리고 Calendar

항상 선호하는 것이 가장 좋습니다 Calendar ~ 위에 Date

이 레거시 수업을 피하십시오 전적으로. 사용 Java.Time 대신 수업.

  • 잠시 동안 UTC, 사용 Instant
    (현대 동등한 Date)
  • 특정한 순간 시간대, 사용 ZonedDateTime
    (현대 동등한 GregorianCalendar)
  • 특정한 순간 UTC에서 오프셋, 사용 OffsetDateTime
    (레거시 클래스에서도 동등하지 않음)
  • 알려지지 않은 시간대 또는 오프셋이있는 날짜 시간 (순간이 아님)의 경우 사용하십시오. LocalDateTime
    (레거시 클래스에서도 동등하지 않음)

세부

그만큼 Ortomala의 답변 Lokni는 현대를 사용하는 것을 제안 할 권리가 있습니다 Java.Time 귀찮은 오래된 레거시 날짜 시간 수업이 아닌 클래스 (Date, Calendar, 등.). 그러나 그 대답은 잘못된 클래스를 동등한 것으로 암시합니다 (그 대답에 대한 나의 의견 참조).

Java.Time 사용

java.time 클래스는 a 대단한 레거시 날짜 시간 수업, 밤낮 차이 개선. 구식 수업은 제대로 설계되지 않고 혼란스럽고 번거 롭습니다. 가능할 때마다 구형 수업을 피해야합니다. 그러나 이전/신규로/새로 변환해야 할 때 새로운 방법을 호출하여 추가 할 수 있습니다. 낡은 클래스.

전환에 대한 자세한 내용은 참조하십시오 내 대답과 멋진 다이어그램 또 다른 질문에 java.util.date를“Java.Time”유형으로 변환합니까?.

스택 오버 플로우를 검색하면 java.time 사용에 대한 수백 가지 예제 질문과 답변이 제공됩니다. 그러나 여기에 빠른 시놉시스가 있습니다.

Instant

현재 순간을 얻으십시오 Instant. 그만큼 Instant 클래스는 타임 라인의 순간을 나타냅니다 UTC 해상도와 함께 나노 초 (최대 9 개) 소수점 분수의 숫자).

Instant instant = Instant.now();

ZonedDateTime

그것을 보려면 같은 동시 순간 특정 지역의 렌즈를 통해 벽 클록 시간, 시간대를 적용하십시오 (ZoneId) 얻기 위해 ZonedDateTime.

시간대

지정 a 적절한 시간대 이름 형식으로 continent/region, 와 같은 America/Montreal, Africa/Casablanca, 또는 Pacific/Auckland. 3-4 문자 약어를 사용하지 마십시오 EST 또는 IST 그대로 ~ 아니다 표준화되지 않았으며 독특하지 않은 실제 시간대. (!).

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone();

오프셋

시간대는 지역의 변화의 역사입니다. UTC에서 오프셋. 그러나 때로는 전체 구역이없는 오프셋 만 주어집니다. 이 경우 사용하십시오 OffsetDateTime 수업.

ZoneOffset offset = ZoneOffset.parse( "+05:30" );
OffsetDateTime odt = instant.atOffset( offset );

단순한 오프셋을 사용하는 것보다 시간대의 사용이 바람직합니다.

LocalDateTime

"로컬" Local… 수업은 의미합니다 어느 특정 지역이 아닌 지역. 따라서 이름은 반 직관적 일 수 있습니다.

LocalDateTime, LocalDate, 그리고 LocalTime 의도적으로 오프셋 또는 시간대에 대한 정보가 부족합니다. 그래서 그들은합니다 ~ 아니다 실제 순간을 나타냅니다 ~ 아니다 타임 라인의 포인트. 의심 스럽거나 혼란 스러울 때 사용하십시오 ZonedDateTime 보다는 LocalDateTime. 훨씬 더 많은 토론을 위해 검색 스택 오버 플로우.

문자열

날짜 시간을 값을 나타내는 문자열과 충돌하지 마십시오. 문자열을 구문 분석하여 날짜 시간 개체를 얻을 수 있으며 날짜 시간 객체에서 문자열을 생성 할 수 있습니다. 그러나 문자열은 결코 날짜 자체가 아닙니다.

표준에 대해 알아보십시오 ISO 8601 Java.Time 클래스에서 기본적으로 사용되는 형식.


에 대한 Java.Time

그만큼 Java.Time 프레임 워크는 Java 8 이상에 내장되어 있습니다. 이 수업은 번거로운 오래된 것을 대체합니다 유산 다음과 같은 날짜 시간 수업 java.util.Date, Calendar, & SimpleDateFormat.

그만큼 조다-시간 지금 프로젝트 유지 관리 모드, Java.Time 클래스.

자세한 내용은 오라클 튜토리얼. 많은 예와 설명에 대한 검색 스택 오버 플로우. 사양입니다 JSR 310.

사용 a JDBC 드라이버 준수합니다 JDBC 4.2 또는 나중에 교환 할 수 있습니다 Java.Time 데이터베이스와 직접 개체. 문자열이나 java.sql.* 클래스가 필요하지 않습니다.

Java.Time 수업을 어디에서 얻을 수 있습니까?

그만큼 Threeten-extra 프로젝트는 추가 클래스로 Java.Time을 연장합니다. 이 프로젝트는 Java.Time에 향후 추가 할 수있는 근거입니다. 여기에서 유용한 수업을 찾을 수 있습니다 Interval, YearWeek, YearQuarter, 그리고 .

Java 8, 새로운 Java.Time 패키지 사용되어야한다.

물체는 불변이 불변이며 시간대와 일광 절약이 고려됩니다.

당신은 a를 만들 수 있습니다 ZonedDateTime 오래된 대상 java.util.Date 이와 같은 개체 :

    Date date = new Date();
    ZonedDateTime zonedDateTime = date.toInstant().atZone(ZoneId.systemDefault());

나는 항상 옹호합니다 조다-시간. 이유는 다음과 같습니다.

  1. API는 일관되고 직관적입니다. java.util.date/calendar apis와 달리
  2. 스레딩 문제로 고통받지 않습니다 java.text.simpledateformat 등.
  3. 새로운 Java 날짜/시간 API의 기초입니다 (JSR310, Java 8으로 예정되어 있으므로 Core Java API가 될 API를 사용하게됩니다.

편집 : Java 8에 도입 된 Java 날짜/시간 클래스는 이제 Java 8으로 마이그레이션 할 수 있다면 선호되는 솔루션입니다.

파티에서 조금 늦었지만 Java는 JDK 8에 새로운 날짜 시간 API를 가지고 있습니다. JDK 버전을 업그레이드하고 표준을 수용 할 수 있습니다. 더 이상 지저분한 날짜/달력, 더 이상 타사 항아리가 없습니다.

날짜는 다시 개발되어야합니다. 긴 인터저기 대신에 별도의 필드로 연도, 월, 날짜, 시간, 분, 둘째를 유지해야합니다. 이 날짜와 관련된 일정과 시간대를 저장하는 것이 좋을 수도 있습니다.

우리의 자연스러운 대화에서, 2013 년 11 월 1 일 오후 1시에 약속을 설정하면 이것은 시간이 지남에 따라 다릅니다. 캘린더가 아닙니다. 따라서 우리는 Java에서도 이와 같이 대화 할 수 있어야합니다.

날짜가 긴 정수 (1970 년 1 월 1 일 이후 밀리 초)로 저장되는 경우 현재 날짜는 달력에 따라 다릅니다. 달력이 다른 날짜를 제공합니다. 이것은 절대적인 시간을주는 전망 (예 : 빅뱅 후 1 조 초)입니다. 그러나 종종 우리는 또한 연도, 월 등을 캡슐화하는 물체와 같은 편리한 대화 방식이 필요합니다.

Java 에이 두 가지 목표를 조정하기위한 새로운 발전이 있는지 궁금합니다. 어쩌면 내 Java 지식이 너무 늙었을 수도 있습니다.

btw "date"는 일반적으로 "쓸모없는 / 감가 상각 된"(정확히 이유를 모르겠다)로 태그되어있다 - 그것에 대해 뭔가 썼다.Java : 날짜 생성자가 더 이상 사용되지 않는 이유는 무엇이며 대신 무엇을 사용합니까?

그것은 생성자 만 새 날짜 (int 연도, int month, int day), 권장 방법은 캘린더를 통한 것입니다.Calendar Cal = Calendar.getInstance (); )

나는 시간을 이동하는 것과 같은 날짜에 대한 특정 작업이 필요할 때 달력을 사용하지만, 날짜는 당신이 당신의 요구를 조정하기 위해 날짜를 포맷해야 할 때 도움이 될 때 도움이된다는 것을 알게되었습니다. 최근 로케일은 많은 유용한 작업과 방법이 있음을 발견했습니다. 나는 지금 로케일을 사용하고있다!

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