programing

Instant와 LocalDateTime의 차이점은 무엇입니까?

goodcopy 2022. 8. 1. 21:58
반응형

Instant와 LocalDateTime의 차이점은 무엇입니까?

알고 있습니다.

  • Instant는 컴퓨팅의 "기술적인" 타임스탬프 표현(나노초)입니다.
  • LocalDateTime은 인간의 시간대를 포함한 날짜/시계 표현입니다.

그러나 IMO는 대부분의 응용 프로그램 사용 사례에서 모두 유형으로 간주할 수 있습니다.예: 현재 날짜를 기준으로 다음 실행을 계산해야 하는 배치 작업을 실행하고 있으며, Instant의 나노초 정밀도와 LocalDateTime의 시간대 부분을 제외하고 이 두 유형 사이에서 장단점을 찾는 데 어려움을 겪고 있습니다.

Instant 또는 LocalDateTime만 사용해야 하는 응용 프로그램의 예를 몇 가지 들 수 있습니까?

편집: LocalDateTime의 정밀도와 타임존에 관한 문서를 잘못 읽어 주의해 주십시오.

Java의 모든 날짜 유형(현대 및 레거시) 표

dr;dr

Instant ★★★★★★★★★★★★★★★★★」LocalDateTime혀른른하다하나는 순간을 나타내고 다른 하나는 그렇지 않다.

  • Instant는 타임라인의 특정 포인트를 나타냅니다.
  • LocalDateTime는 날짜와 시각을 나타냅니다.그러나 시간대나 UTC로부터의 오프셋이 없기 때문에 이 클래스일각을 나타낼없습니다.이는 전 세계 모든 시간대의 범위인 약 26시간에서 27시간의 잠재적 순간을 나타냅니다.aLocalDateTime값은 본질적으로 애매합니다.

잘못된 추정

LocalDateTime인간의 시간을 포함한 날짜/시계 표현입니다.

A에는 타임존이 없습니다.타임존이 없는 것이 그 클래스의 포인트입니다.

해당 클래스의 문서를 인용하려면:

이 클래스는 시간대를 저장하거나 나타내지 않습니다.대신, 생일날 사용되는 날짜를 벽시계에서 볼 수 있는 현지 시간과 결합한 설명입니다.오프셋이나 시간대 등의 추가 정보가 없으면 타임라인의 순간을 나타낼 수 없습니다.

★★★★★★★★★★★★★★★★★.Local…는 "존 분할되지 않음, 오프셋 없음"을 의미합니다.

Instant

여기에 이미지 설명 입력

는 1970 UTC의 첫 번째 순간 이후 타임라인상의 순간입니다(기본적으로 자세한 내용은 클래스 문서를 참조하십시오).비즈니스 로직, 데이터 스토리지 및 데이터 교환의 대부분은 UTC여야 하므로 자주 사용하는 편리한 클래스입니다.

Instant instant = Instant.now() ;  // Capture the current moment in UTC.

OffsetDateTime

여기에 이미지 설명 입력

클래스 클래스는 UTC의 전후 또는 전후를 나타내는 콘텍스트를 가지는 일시입니다.오프셋의 양(시간-분-초)은 클래스로 표시됩니다.

시간(hours-minutes-seconds)이 0인 경우,는 와 같은 UTC 내의 순간을 나타냅니다.

ZoneOffset

여기에 이미지 설명 입력

클래스는 UTC로부터의 오프셋(UTC보다 앞 또는 UTC보다 뒤의 시간-분초)을 나타냅니다.

A ZoneOffset단지 몇 시간 몇 분밖에 안 됩니다.존에는 오프셋할 이름과 변경 이력이 있습니다.따라서 단순히 오프셋을 사용하는 것보다 존을 사용하는 것이 항상 더 좋습니다.

ZoneId

여기에 이미지 설명 입력

타임존은 클래스로 표시됩니다.

예를 들어 파리에서는 몽트레알보다 새로운 날이 일찍 밝는다.따라서 특정 지역에 대해 (태양이 바로 머리 위에 있는) 정오를 더 잘 반영하기 위해 시계 바늘을 움직일 필요가 있습니다.서유럽/아프리카 UTC 선에서 동쪽으로/서쪽으로 멀어질수록 오프셋이 커진다.

타임존은 로컬커뮤니티 또는 지역에 의해 실시되고 있는 조정 및 이상을 처리하기 위한 일련의 규칙입니다.가장 일반적인 이상은 DST(Daylight Saving Time)로 알려진 매우 일반적인 루니시입니다.

타임존에는 과거 규칙, 현재 규칙 및 가까운 미래에 대해 확인된 규칙의 이력이 있습니다.

이러한 규칙은 생각보다 자주 변경됩니다.일반적으로 'tz' 데이터베이스의 복사본인 날짜 라이브러리 규칙을 최신 상태로 유지하십시오.최신을 기르는 것은 이전보다 지금 자바 8에서 오라클은 Timezone Updater 도구 출시와 함께.

형식에 적절한 시간대 이름을 지정하십시오.Continent/Region 「」, 「」등입니다.America/Montreal,Africa/Casablanca 「」Pacific/Auckland. 은 2 와 같은 사용하지 마세요.EST ★★★★★★★★★★★★★★★★★」IST그들이 시간대 진실하지 않고 심지어 unique(!)지 않지 않다.

TimeZone)오프셋+조정의 규칙.

ZoneId z = ZoneId.of( “Africa/Tunis” ) ; 

ZonedDateTime

여기에 이미지 설명 입력

생각해 주시고 ZonedDateTime의 개념적으로로.Instant「」가되어 .ZoneId.

ZonedDateTime)(인스턴트+ZoneId)

로 wall-clock 시간 특정 지역(시간대.)의 사람들에 의해 사용된:현재 순간을 캡처하려면.

ZonedDateTime zdt = ZonedDateTime.now( z ) ;  // Pass a `ZoneId` object such as `ZoneId.of( "Europe/Paris" )`. 

거의 모든 당신의 후위, 데이터베이스 비즈니스 논리, 데이터 지속성, 데이터 교환 모두 협정 세계시에 있어야 한다.하지만 사용자에서 발표하기 위해 당신은 시간대는 사용자들이 예상에 맞출 필요가 있다.이 이이의 이다.ZonedDateTimeclass 및 이러한 날짜 시간 값의 String 표현을 생성하기 위해 사용되는 포메터 클래스.

ZonedDateTime zdt = instant.atZone( z ) ;
String output = zdt.toString() ;                 // Standard ISO 8601 format.

를 사용하여 현지화된 형식의 텍스트를 생성할 수 있습니다.

DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL ).withLocale( Locale.CANADA_FRENCH ) ; 
String outputFormatted = zdt.format( f ) ;

마르디 30 avril 2019 à 23 h 22 min 55 s heure de l'Inde

LocalDate,LocalTime,LocalDateTime

LocalDate 달력만 보여주는 다이어그램입니다.

Local Time의 클럭만을 나타내는 다이어그램.

LocalDateTime의 달력과 클럭을 나타내는 다이어그램.

"로컬" 날짜 시간 클래스 , , 는 다른 종류의 크리티컬입니다.는 1개의 지역 또는 타임존에 얽매이지 않습니다.타임라인에 얽매이지 않습니다.타임라인에서 점을 찾기 위해 로컬에 적용하기 전까지는 의미가 없습니다.

이러한 클래스 이름에 있는 "Local"이라는 단어는 초보자에게 직관에 반할 수 있습니다.이 단어는 특정 지역 또는 모든 지역을 의미하지만 특정 지역을 의미하지는 않습니다.

따라서 비즈니스 애플리케이션의 경우 "로컬" 유형은 타임라인 상의 특정 순간이 아니라 가능한 날짜 또는 시간에 대한 일반적인 개념만을 나타내기 때문에 자주 사용되지 않습니다.비즈니스 앱은 청구서가 도착한 정확한 시점, 운송을 위해 발송된 제품, 직원이 고용된 시점, 또는 택시가 정비소를 떠난 시점에 신경을 쓰는 경향이 있습니다.비즈니스 앱 개발자는Instant ★★★★★★★★★★★★★★★★★」ZonedDateTime가장 일반적인 수업입니다.

언제 요?LocalDateTime? 세 가지 세 가지 상황에서

  • 특정 날짜와 시간을 여러 장소에 적용하려고 합니다.
  • 예약을 하고 있습니다.
  • 우리는 의도되었지만 결정되지 않은 시간대를 가지고 있다.

이들 3가지 케이스 중 타임라인상의 특정 포인트와 관련된 것은 없습니다.이것들 중 어느 것도 순간적인 것은 아닙니다.

하루 중 하나의 시간, 여러 순간

경우에 따라서는 특정 날짜에 특정 시간을 나타내려고 하는데, 이 시간을 여러 시간대에 걸쳐서 여러 로케일에 적용하려고 합니다.

들어 12월 25일 12시 25분입니다LocalDateTime자정은 파리에서는 몽트레알과 다른 시간에, 시애틀과 오클랜드에서는 또 다른 시간에 일어난다.

LocalDate ld = LocalDate.of( 2018 , Month.DECEMBER , 25 ) ;
LocalTime lt = LocalTime.MIN ;   // 00:00:00
LocalDateTime ldt = LocalDateTime.of( ld , lt ) ;  // Christmas morning anywhere. 

다른 "는 전 세계 각 있다"는 것은 "Acme Company"이다.LocalTime진정한 의미를 가지려면 타임라인에 적용해서 슈투트가르트 공장에서의 12시 30분 또는 라바트 공장에서의 12시 30분 또는 시드니 공장에서의 12시 30분의 시간을 측정해야 합니다.

예약 예약

다른 으로 사용할 수 있습니다.LocalDateTime는 향후 이벤트를 예약하기 위한 것입니다(예: 치과 예약).이러한 임명은 정치인들이 시간대를 재정의하는 위험을 감수하기에 충분히 먼 미래일 수 있다.정치인들은 종종 경고를 거의 하지 않거나 아예 경고를 하지 않는다.정치인들이 시계를 어떻게 가지고 놀든 상관없이 "다음 1월 23일 오후 3시"를 의미하는 경우, 예를 들어 그 지역에서 서머타임이 채택되거나 폐지되면 오후 3시가 오후 2시 또는 오후 4시로 바뀌는 순간을 기록할 수 없습니다.

경우 "A"를 합니다.LocalDateTime a. a. a.ZoneId 보관하다할 때 를 호출하여 합니다.LocalDateTime::atZone( ZoneId ) ZonedDateTime★★★★★★ 。

ZonedDateTime zdt = ldt.atZone( z ) ;  // Given a date, a time-of-day, and a time zone, determine a moment, a point on the timeline.

UTC로 하다Instant ZonedDateTime.

Instant instant = zdt.toInstant() ;  // Adjust from some zone to UTC. Same moment, same point on the timeline, different wall-clock time.

알 수 없는 영역

은 이 말을 사용할 수도 .LocalDateTime시간대 또는 오프셋을 알 수 없는 상황에서.

나는 이 사건이 부적절하고 현명하지 못하다고 생각한다.구역 또는 오프셋이 의도되었지만 결정되지 않은 경우 잘못된 데이터가 있는 것입니다.즉, 의도한 통화(달러, 파운드, 유로 등)를 모른 채 상품 가격을 보관하는 것과 같습니다.좋지 않은 생각이다.

모든 날짜 유형

완전성을 위해 Java에서 최신 및 레거시 모두 가능한 모든 날짜 유형 및 SQL 표준에 의해 정의된 유형의 표를 다음에 나타냅니다. 하면 , 의, the, the, , 의, 의, this, this, this, this, this, this, this, this, this, this, this, this, this, this the,Instant&LocalDateTime더 큰 컨텍스트의 클래스입니다.

Java의 모든 날짜 유형(현대 및 레거시 모두) 및 SQL 표준 표.

Java 팀이 JDBC 4.2를 설계할 때 한 이상한 선택에 주목하십시오.이들은 가장 일반적으로 사용되는 두 가지 클래스를 제외한 모든 java.time 시간을 지원하기로 선택했습니다.Instant&ZonedDateTime.

하지만 걱정할 것은 없습니다.우리는 쉽게 앞뒤로 변환할 수 있다.

Instant.

// Storing
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ;
myPreparedStatement.setObject( … , odt ) ;

// Retrieving
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
Instant instant = odt.toInstant() ;

ZonedDateTime.

// Storing
OffsetDateTime odt = zdt.toOffsetDateTime() ;
myPreparedStatement.setObject( … , odt ) ;

// Retrieving
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
ZoneId z = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime zdt = odt.atZone( z ) ; 

java.time 정보

java.time 프레임워크는 Java 8 이후에 포함되어 있습니다.이러한 클래스는 , 및 등 문제가 많은 오래된 레거시 날짜 시간 클래스를 대체합니다.

자세한 내용은 Oracle 자습서를 참조하십시오.또한 Stack Overflow를 검색하여 많은 예와 설명을 확인하십시오.사양은 JSR 310입니다.

현재 유지보수 모드에 있는 조다 타임 프로젝트는 java.time 클래스로의 이행을 권장합니다.

java.time 객체를 데이터베이스와 직접 교환할 수 있습니다.JDBC 4.2 이후준거한JDBC 드라이버를 사용합니다.스트링도 필요 없고java.sql.*반.휴지 상태 5 및 JPA 2.2는 java.time을 지원합니다.

java.time 클래스는 어디서 얻을 수 있습니까?

Java 또는 Android 버전에 사용할 java.time 라이브러리의 표

쓰리텐 엑스트라 프로젝트는 java.time을 추가 클래스로 확장합니다.이 프로젝트는 향후 java.time에 추가될 수 있는 가능성을 입증하는 기반입니다.여기에는 , , , 유용한 클래스가 있습니다.

주요 은 " " " " 입니다.LocalLocalDateTime만약 당신이 독일에 살고 있고, 그것을 만든다면LocalDateTime인스턴스(instance)와 다른 사용자가 미국에 거주하며 바로 그 순간에 다른 인스턴스를 만듭니다(클럭이 올바르게 설정되어 있는 경우).을 사용법은 것 this this this this this this 。Instant이치노

LocalDateTime는 타임존 없이 날짜와 시간을 저장하지만 초기값은 타임존에 따라 달라집니다. Instant을 사용하다

하다.LocalDateTime에 일, 시간, 월 등의 날짜 구성요소를 조작하는 방법을 나타냅니다.Instant지지않않않않

Instant의 나노초 정밀도와 LocalDateTime의 시간대 부분을 제외하고

두 클래스의 정밀도는 동일합니다. LocalDateTime는 타임존을 저장하지 않습니다.다음과 같은 잘못된 가정으로 인해 큰 실수를 할 수 있으므로 javadocs를 자세히 읽어보십시오.InstantLocalDateTime.

잘못 알고 있습니다.시간대 정보는 저장되지 않으며 정밀도는 나노초입니다.자바독(강조 광산)을 인용하면:

ISO-8601 캘린더 시스템에서 표준시가 없는 날짜 시간(예: 2007-12-03T10:15:30).

LocalDateTime은 날짜 시간을 나타내는 불변의 날짜 개체로, 종종 년 월 일 분 초로 표시됩니다.요일, 요일, 주 등 다른 날짜 및 시간 필드에도 액세스할 수 있습니다.시간은 나노초의 정밀도로 표현됩니다.예를 들어 "2nd October 2007 at 13:45.30.123456789" 값은 LocalDateTime에 저장할 수 있습니다.

이 둘의 차이는 Epoch(01-01-1970)로부터의 오프셋을 나타내며, 따라서 타임라인상의 특정 순간을 나타낸다는 것입니다.두명Instant지구의 서로 다른 두 곳에서 같은 순간에 만들어진 물체들은 정확히 같은 값을 갖게 될 것이다.

언급URL : https://stackoverflow.com/questions/32437550/whats-the-difference-between-instant-and-localdatetime

반응형