tl; dr
최신 java.time 클래스 만 사용하십시오 . 절대로 같은 끔찍한 기존의 클래스를 사용하지 않는 SimpleDateFormat
, Date
또는 java.sql.Timestamp
.
ZonedDateTime // Represent a moment as perceived in the wall-clock time used by the people of a particular region ( a time zone).
.now( // Capture the current moment.
ZoneId.of( "Africa/Tunis" ) // Specify the time zone using proper Continent/Region name. Never use 3-4 character pseudo-zones such as PDT, EST, IST.
) // Returns a `ZonedDateTime` object.
.format( // Generate a `String` object containing text representing the value of our date-time object.
DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" )
) // Returns a `String`.
또는 JVM 의 현재 기본 시간대를 사용하십시오.
ZonedDateTime
.now( ZoneId.systemDefault() )
.format( DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" ) )
java.time 및 JDBC 4.2
현대적인 접근법은 위에서 본 java.time 클래스를 사용합니다 .
귀하의 경우 JDBC 드라이버 와 준수 JDBC 4.2 , 직접 교환 할 수 java.time은 데이터베이스와 객체. PreparedStatement::setObject
및을 사용하십시오 ResultSet::getObject
.
JDBC 4.2 이전의 드라이버에만 java.sql을 사용하십시오.
JDBC 드라이버가 java.time 유형 지원을 위해 JDBC 4.2를 아직 준수하지 않으면 java.sql 클래스 사용으로 폴백해야합니다.
데이터 저장
OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ; // Capture the current moment in UTC.
myPreparedStatement.setObject( … , odt ) ;
데이터를 검색하는 중입니다.
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
와 같은 java.sql 유형 java.sql.Timestamp
은 데이터베이스 내외부 전송에만 사용해야합니다. Java 8 이상에서 즉시 java.time 유형으로 변환하십시오.
java.time.Instant
A는 java.sql.Timestamp
A를 매핑 java.time.Instant
, UTC의 타임 라인에 잠시. toInstant
이전 클래스에 추가 된 새 변환 방법 을 확인하십시오.
java.sql.Timestamp ts = myResultSet.getTimestamp( … );
Instant instant = ts.toInstant();
시간대
원하는 / 예상 시간대를 (적용 ZoneId
를 얻기 위해) ZonedDateTime
.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
형식화 된 문자열
a DateTimeFormatter
를 사용하여 문자열을 생성하십시오. 패턴 코드는 코드 코드와 유사 java.text.SimpleDateFormat
하지만 정확하게는 아니므로 문서를주의 깊게 읽으십시오.
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" );
String output = zdt.format( formatter );
이 특정 형식은 UTC에서 오프셋 또는 시간대 표시가 없기 때문에 정확한 의미는 모호 합니다.
ISO 8601
이 문제에 대해 언급이있는 경우 직접 롤링하는 대신 표준 ISO 8601 형식을 사용하는 것이 좋습니다 . 표준 형식은 귀하의 형식과 매우 유사합니다. 예를 들면 다음과 같습니다
2016-02-20T03:26:32+05:30
..
java.time 클래스는 기본적으로 이러한 표준 형식을 사용하므로 패턴을 지정할 필요가 없습니다. 이 ZonedDateTime
클래스는 표준 시간대 이름을 추가하여 표준 형식을 확장합니다 (현명한 개선).
String output = zdt.toString(); // Example: 2007-12-03T10:15:30+01:00[Europe/Paris]
java.sql로 변환
java.time에서로 다시 변환 할 수 있습니다 java.sql.Timestamp
. 에서을 추출 Instant
하십시오 ZonedDateTime
.
java.time 클래스와의 변환을 용이하게하기 위해 이전 클래스에 새로운 메소드가 추가되었습니다.
java.sql.Timestamp ts = java.sql.Timestamp.from( zdt.toInstant() );
java.time에 대하여
java.time의 프레임 워크는 나중에 자바 8에 내장되어 있습니다. 이 클래스는 까다로운 기존에 대신 기존 과 같은 날짜 - 시간의 수업을 java.util.Date
, Calendar
, SimpleDateFormat
.
Joda 타임 프로젝트는 지금에 유지 관리 모드 의로 마이그레이션을 조언 java.time의 클래스.
자세한 내용은 Oracle Tutorial을 참조하십시오 . 많은 예제와 설명을 보려면 스택 오버플로를 검색하십시오. 사양은 JSR 310 입니다.
java.time 객체를 데이터베이스와 직접 교환 할 수 있습니다 . JDBC 4.2 이상을 준수 하는 JDBC 드라이버를 사용하십시오 . 문자열이 필요없고 수업이 필요 없습니다 .java.sql.*
java.time 클래스는 어디서 구할 수 있습니까?
ThreeTen - 추가 프로젝트 추가 클래스와 java.time를 확장합니다. 이 프로젝트는 향후 java.time에 추가 될 수있는 입증 된 근거입니다. 당신은 여기에 몇 가지 유용한 클래스와 같은 찾을 수 있습니다 Interval
, YearWeek
, YearQuarter
, 그리고 더 .