JodaTime 1.6.2를 사용하고 있습니다.
나는 LocalDate
(Joda) LocalDateTime
또는 java.sqlTimestamp
ormapping을 위해 변환 해야하는 것을 가지고 있습니다 .
그 이유는 a LocalDateTime
와 a 사이에서 변환하는 방법을 알아 냈기 때문입니다 java.sql.Timestamp
.
LocalDateTime ldt = new LocalDateTime();
DateTimeFormatter dtf = DateTimeFormatter.forPattern("yyyy-MM-dd HH:mm:ss");
Timestamp ts = Timestamp.valueOf(ldt.toString(dtf));
그래서, 난 그냥 사이의 변환을 할 수있는 경우 LocalDate
와 LocalDateTime
, 그때까지 계속 변환을 할 수 있습니다 java.sql.Timestamp
. 올바른 방향으로 넛지 해 주셔서 감사합니다!
답변
JodaTime
JodaTime의 변환하기 org.joda.time.LocalDate
위해 java.sql.Timestamp
, 단지 할
Timestamp timestamp = new Timestamp(localDate.toDateTimeAtStartOfDay().getMillis());
JodaTime의 변환하기 org.joda.time.LocalDateTime
위해 java.sql.Timestamp
, 단지 할
Timestamp timestamp = new Timestamp(localDateTime.toDateTime().getMillis());
JavaTime
Java8의 변환하기 java.time.LocalDate
위해 java.sql.Timestamp
, 단지 할
Timestamp timestamp = Timestamp.valueOf(localDate.atStartOfDay());
Java8의 변환하기 java.time.LocalDateTime
위해 java.sql.Timestamp
, 단지 할
Timestamp timestamp = Timestamp.valueOf(localDateTime);
답변
Java 8 시간 API를 사용하는 가장 좋은 방법 :
LocalDateTime ldt = timeStamp.toLocalDateTime();
Timestamp ts = Timestamp.valueOf(ldt);
모델에 넣은 JPA와 함께 사용하려면 ( https://weblogs.java.net/blog/montanajava/archive/2014/06/17/using-java-8-datetime-classes-jpa ) :
@Converter(autoApply = true)
public class LocalDateTimeConverter implements AttributeConverter<LocalDateTime, Timestamp> {
@Override
public Timestamp convertToDatabaseColumn(LocalDateTime ldt) {
return Timestamp.valueOf(ldt);
}
@Override
public LocalDateTime convertToEntityAttribute(Timestamp ts) {
return ts.toLocalDateTime();
}
}
이제 상대적인 시간대 독립 시간입니다. 또한 쉽게 할 수 있습니다.
LocalDate ld = ldt.toLocalDate();
LocalTime lt = ldt.toLocalTime();
포맷 :
DateTimeFormatter DATE_TME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")
String str = ldt.format(DATE_TME_FORMATTER);
ldt = LocalDateTime.parse(str, DATE_TME_FORMATTER);
업데이트 : postgres 9.4.1208, HSQLDB 2.4.0 등은 대화없이 Java 8 Time API를 이해합니다!
답변
tl; dr
Joda 타임 프로젝트는 지금 대체 유지 보수 모드에 java.time의 클래스.
java.time.Instant
수업을 사용하십시오 .- 필요 없음 :
LocalDateTime
java.sql.Timestamp
- 문자열
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 클래스는 어디서 구할 수 있습니까?
- 자바 SE 8 , 자바 SE 9 , 나중에
- 내장.
- 번들로 구현 된 표준 Java API의 일부입니다.
- Java 9에는 몇 가지 사소한 기능과 수정 사항이 추가되었습니다.
- Java SE 6 및 Java SE 7
- java.time 기능의 대부분은 ThreeTen-Backport의 Java 6 및 7로 백 포트됩니다 .
- 기계적 인조 인간
- java.time 클래스의 최신 버전의 Android 번들 구현.
- 이전 Android (<26)의 경우 ThreeTenABP 프로젝트는 ThreeTen-Backport (위에서 언급)를 채택합니다 . ThreeTenABP 사용 방법…을 참조하십시오 .
ThreeTen – 추가 프로젝트 추가 클래스와 java.time를 확장합니다. 이 프로젝트는 java.time에 향후 추가 할 수있는 가능성을 입증하는 곳입니다. 당신은 여기에 몇 가지 유용한 클래스와 같은 찾을 수 있습니다 Interval
, YearWeek
, YearQuarter
, 그리고 더 .
답변
시간대에 따라 몇 분을 잃을 수 있습니다 (1650-01-01 00:00:00은 1649-12-31 23:52:58이됩니다).
이를 방지하려면 다음 코드를 사용하십시오.
new Timestamp(localDateTime.getYear() - 1900, localDateTime.getMonthOfYear() - 1, localDateTime.getDayOfMonth(), localDateTime.getHourOfDay(), localDateTime.getMinuteOfHour(), localDateTime.getSecondOfMinute(), fractional);
답변
Joda가 퇴색하기 때문에, 누군가가 변환 할 수 있습니다 LocaltDate
에 LocalDateTime
자바 (8)에서 자바 8 LocalDateTime
그것이 만드는 방법 줄 것이다 LocalDateTime
사용하여 인스턴스를 LocalDate
와 LocalTime
. 여기에서 확인 하세요.
공개 정적 LocalDateTime of (LocalDate 날짜, LocalTime 시간)
샘플은 다음과 같습니다.
// just to create a sample LocalDate
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate ld = LocalDate.parse("20180306", dtf);
// convert ld into a LocalDateTime
// We need to specify the LocalTime component here as well, it can be any accepted value
LocalDateTime ldt = LocalDateTime.of(ld, LocalTime.of(0,0)); // 2018-03-06T00:00
참고로 아래의 epoch 초를 얻기 위해 사용할 수 있습니다.
ZoneId zoneId = ZoneId.systemDefault();
long epoch = ldt.atZone(zoneId).toEpochSecond();
// If you only care about UTC
long epochUTC = ldt.toEpochSecond(ZoneOffset.UTC);
답변
객체 asStartOfDay()
에 대한 함수 호출 은 java.time.LocalDate
객체를 반환 java.time.LocalDateTime
합니다.
답변
Java8 +
import java.time.Instant;
Instant.now().getEpochSecond(); //timestamp in seconds format (int)
Instant.now().toEpochMilli(); // timestamp in milliseconds format (long)