LocalDate를 LocalDateTime 또는 java.sql.Timestamp로 변환


126

JodaTime 1.6.2를 사용하고 있습니다.

나는 LocalDate(Joda) LocalDateTime또는 java.sqlTimestampormapping을 위해 변환 해야하는 것을 가지고 있습니다 .

그 이유는 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));

그래서, 난 그냥 사이의 변환을 할 수있는 경우 LocalDateLocalDateTime, 그때까지 계속 변환을 할 수 있습니다 java.sql.Timestamp. 올바른 방향으로 넛지 해 주셔서 감사합니다!


참고로 Joda-Time 프로젝트는 이제 유지 관리 모드 에 있으며 팀은 java.time 클래스 로의 마이그레이션을 조언합니다 . Oracle의 Tutorial을 참조하십시오 . 또한 java.sql.Timestamp클래스는 이제 레거시이며 java.time 클래스, 특히 Instant.
Basil Bourque

답변:


269

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);

모든 이 유효한 것은 아니므 LocalDateTimeDateTime로 변환 할 때주의하십시오 . 출처 : joda-time.sourceforge.net/faq.html#illegalinstant 및이 문제를 해결했습니다. LocalDateTimeDateTime
크리스토프 드 Troyer

valueOf ()가 문자열을 받아들이 기 때문에 인수에 컴파일 오류가 발생했습니다.
Patriotic

@Patriotic : 실제로 Java SE 1.8 이상을 사용하지 않는 경우에만 발생합니다. 답변과 Javadoc에 대한 제공된 링크에 표시된 것처럼 (위 답변의 파란색 텍스트는 실제로 링크이며 클릭하여 Javadoc로 드릴 다운 할 수 있음) Timestamp#valueOf()메소드는 Java SE 1.8부터 LocalDateTime.
BalusC

60

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를 이해합니다!


17

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.timeJoda-Time 모두 에서 LocalDateTime의도적으로 시간대 또는 UTC로부터의 오프셋 개념이 없습니다. 따라서 이는 순간을 나타내지 않으며 타임 라인의 한 지점 이 아닙니다 . A LocalDateTime는 약 26-27 시간의 범위에서 잠재적 인 순간 에 대한 대략적인 아이디어를 나타냅니다 .

를 사용 LocalDateTime하기위한 중 오프셋 영역 / (안 좋은 상황)를 알 수 없거나 영역 오프셋 때 불확정 때. 예를 들어 '2018 년 12 월 25 일의 첫 번째 순간에 크리스마스가 시작됩니다'는 LocalDateTime.

를 사용하여 ZonedDateTime특정 시간대의 순간을 나타냅니다. 예를 들어, Pacific/Auckland또는 같은 특정 영역에서 시작하는 크리스마스 America/MontrealZonedDateTime객체 로 표시됩니다 .

잠시 동안 항상 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, 그리고 .


5

시간대에 따라 몇 분을 잃을 수 있습니다 (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);

3

Joda가 퇴색하기 때문에, 누군가가 변환 할 수 있습니다 LocaltDateLocalDateTime자바 (8)에서 자바 8 LocalDateTime그것이 만드는 방법 줄 것이다 LocalDateTime사용하여 인스턴스를 LocalDateLocalTime. 여기에서 확인 하세요.

공개 정적 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);

LocalDateTime여기에서 전혀 사용할 필요가 없습니다 . 이 클래스는 의도적으로 시간대 또는 UTC로부터의 오프셋 개념이 없습니다. 따라서 여기서는 유용한 목적이 없습니다. 대신 : LocalDate.parse( “20180306” , DateTimeFormatter.BASIC_ISO_DATE ).atStartOfDay( ZoneId.of( “Africa/Tunis” ).toEpochSecond()항상 그런 것은 아니지만 하루가 00:00에 시작한다고 가정하지 마십시오.
Basil Bourque

00.00에서 하루의 시작을 가정하지 마십시오으로 당신은 의미합니까 Whay
주요

1
일광 절약 시간 (DST) 과 같은 예외 는 어떤 장소의 일부 날짜에서 하루가 01:00:00과 같은 다른 시간에 시작될 수 있음을 의미합니다. 따라서 가정하기보다는 java.time 을 호출 java.time.LocalDate.atStartOfDay하여 ZonedDateTime. 내 답변의 예를 참조하십시오 . 내가 언급했듯이 LocalDateTime수업은이 모든면에서 쓸모없고 비생산적입니다.
Basil Bourque

그래서 LocalDateTime우리는 ZoneId?
프라임

내 모든 포인트를 놓친 것 같습니다. 이 페이지에서 내 답변을 다시 읽으십시오. 더 많은 예제와 토론에서 자세히 알아 보려면 Stack Overflow를 검색하세요. 하지만 여기에 마지막으로 말할 것이다 : LocalDateTime되어 있지 여기에 손에 문제에 적합합니다. A LocalDateTime는 순간을 나타내지 않습니다 . A LocalDateTime 이름이 언뜻 보면 다른 의미를 암시 할 수 있지만 특정 지역 이나 시간대 아무 관련없습니다 .이 수업의 의도와 세부 사항에 대해 자세히 알아보십시오. LocalDateTime클래스는이 질문에서 볼 수있는 목적을 목적을 제공하지,하지만.
Basil Bourque

2

객체 asStartOfDay()에 대한 함수 호출 은 java.time.LocalDate객체를 반환 java.time.LocalDateTime합니다.


0

Java8 +

import java.time.Instant;
Instant.now().getEpochSecond(); //timestamp in seconds format (int)
Instant.now().toEpochMilli(); // timestamp in milliseconds format (long)

유용하지만 실제로 질문에 답하지 않는 것 같습니다.
Ole VV

코드 주셔서 감사하지만 질문과 관련이 없습니다.
refaelio
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.