tl; dr
Joda 타임 프로젝트는 지금 대체 유지 보수 모드에 java.time의 클래스.
UTC로 현재 순간을 캡처합니다.
Instant.now()
그 순간을 데이터베이스에 저장하려면 :
myPreparedStatement.setObject( … , Instant.now() ) // Writes an `Instant` to database.
데이터베이스에서 그 순간을 검색하려면 :
myResultSet.getObject( … , Instant.class ) // Instantiates a `Instant`
벽시계 시간을 특정 시간대의 시간으로 조정합니다.
instant.atZone( z ) // Instantiates a `ZonedDateTime`
LocalDateTime
잘못된 수업이야
다른 답변은 정확하지만 LocalDateTime
귀하의 목적에 맞는 잘못된 클래스 를 지적하지 못합니다 .
java.time 및 Joda-Time 모두 에서 LocalDateTime
의도적으로 시간대 또는 UTC로부터의 오프셋 개념이 없습니다. 따라서 이는 순간을 나타내지 않으며 타임 라인의 한 지점 이 아닙니다 . A LocalDateTime
는 약 26-27 시간의 범위에서 잠재적 인 순간 에 대한 대략적인 아이디어를 나타냅니다 .
를 사용 LocalDateTime
하기위한 중 오프셋 영역 / (안 좋은 상황)를 알 수 없거나 영역 오프셋 때 불확정 때. 예를 들어 '2018 년 12 월 25 일의 첫 번째 순간에 크리스마스가 시작됩니다'는 LocalDateTime
.
를 사용하여 ZonedDateTime
특정 시간대의 순간을 나타냅니다. 예를 들어, Pacific/Auckland
또는 같은 특정 영역에서 시작하는 크리스마스 America/Montreal
는 ZonedDateTime
객체 로 표시됩니다 .
잠시 동안 항상 UTC로 Instant
.
Instant instant = Instant.now() ; // Capture the current moment in UTC.
시간대를 적용하십시오. 타임 라인에서 같은 순간, 같은 지점이지만 다른 벽시계 시간으로 봅니다.
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = instant.atZone( z ) ; // Same moment, different wall-clock time.
따라서 LocalDate와 LocalDateTime간에 변환 만 할 수 있다면
아니, 잘못된 전략. 날짜 전용 값이 있고 날짜-시간 값을 원하는 경우 시간을 지정해야합니다. 해당 시간은 특정 구역에 대해 해당 날짜에 유효하지 않을 수 있습니다.이 경우 ZonedDateTime
클래스는 필요에 따라 시간을 자동으로 조정합니다.
LocalDate ld = LocalDate.of( 2018 , Month.JANUARY , 23 ) ;
LocalTime lt = LocalTime.of( 14 , 0 ) ; // 14:00 = 2 PM.
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;
하루의 첫 번째 순간을 시간으로 원한다면 java.time이 그 순간을 결정하도록하십시오. 하루가 00:00:00에 시작한다고 가정하지 마십시오. 일광 절약 시간 (DST)과 같은 예외는 하루가 01:00:00과 같은 다른 시간에 시작될 수 있음을 의미합니다.
ZonedDateTime zdt = ld.atStartOfDay( z ) ;
java.sql.Timestamp
잘못된 수업이야
는 java.sql.Timestamp
에 의해 완전히 대체 지금 레거시있는 귀찮은 된 날짜 - 시간 클래스의 일부입니다 java.time의 클래스. 이 클래스는 나노초 의 해상도로 UTC 의 순간을 나타내는 데 사용되었습니다 . 그 목적은 이제 .java.time.Instant
getObject
/가있는 JDBC 4.2setObject
현재 JDBC 4.2 이상 당신의 JDBC 드라이버는 직접 java.time를 호출하여 데이터베이스와 개체를 교환 할 수 있습니다 :
예를 들면 :
myPreparedStatement.setObject( … , instant ) ;
… 그리고…
Instant instant = myResultSet.getObject( … , Instant.class ) ;
레거시 ⬌ 모던 변환
아직 java.time으로 업데이트되지 않은 이전 코드와 인터페이스해야하는 경우 이전 클래스에 추가 된 새 메소드를 사용하여 앞뒤로 변환하십시오.
Instant instant = myJavaSqlTimestamp.toInstant() ; // Going from legacy class to modern class.
…과…
java.sql.Timestamp myJavaSqlTimestamp = java.sql.Timestamp.from( instant ) ; // Going from modern class to legacy class.
java.time 정보
java.time의 프레임 워크는 나중에 자바 8에 내장되어 있습니다. 이 클래스는 까다로운 기존에 대신 기존 과 같은 날짜 - 시간의 수업을 java.util.Date
, Calendar
, SimpleDateFormat
.
Joda 타임 프로젝트는 지금에 유지 관리 모드 의로 마이그레이션을 조언 java.time의 클래스.
자세한 내용은 Oracle Tutorial을 참조하십시오 . 그리고 많은 예제와 설명을 위해 Stack Overflow를 검색하십시오. 사양은 JSR 310 입니다.
java.time 객체를 데이터베이스와 직접 교환 할 수 있습니다 . JDBC 4.2 이상을 준수 하는 JDBC 드라이버를 사용하십시오 . 문자열이나 클래스 가 필요하지 않습니다 .java.sql.*
java.time 클래스는 어디서 구할 수 있습니까?
ThreeTen - 추가 프로젝트 추가 클래스와 java.time를 확장합니다. 이 프로젝트는 java.time에 향후 추가 할 수있는 가능성을 입증하는 곳입니다. 당신은 여기에 몇 가지 유용한 클래스와 같은 찾을 수 있습니다 Interval
, YearWeek
, YearQuarter
, 그리고 더 .
java.sql.Timestamp
클래스는 이제 레거시이며 java.time 클래스, 특히Instant
.