Programing

Java.time 간 변환.LocalDateTime 및 Java.util.날짜

c10106 2022. 4. 18. 20:29
반응형

Java.time 간 변환.LocalDateTime 및 Java.util.날짜

자바 8은 날짜와 시간에 대한 완전히 새로운 API를 가지고 있다.이 API에서 가장 유용한 클래스 중 하나는LocalDateTime시간대에 독립적인 날짜-시간 값을 보유하는 경우.

레거시 클래스를 사용하는 코드 라인은 수백만 개일 것이다.java.util.Date그래서 시킬 때 둘 이와 같이, 구 코드와 신코드를 상호 접속할 때 둘 사이의 변환이 필요할 것이다.이를 달성하기 위한 직접적인 방법은 없어 보이는데 어떻게 할 수 있겠는가.

단답:

Date in = new Date();
LocalDateTime ldt = LocalDateTime.ofInstant(in.toInstant(), ZoneId.systemDefault());
Date out = Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant());

설명: (이 질문에 근거하여LocalDate)

이름에도 불구하고java.util.Date"날짜"가 아니라 타임라인에서 순간을 나타낸다.개체 내에 저장된 실제 데이터는long00Z) .

에 해당하는 클래스java.util.Date은 JSR-310이다.Instant, 따라서 변환 및 변환을 제공하는 편리한 방법이 있다.

Date input = new Date();
Instant instant = input.toInstant();
Date output = Date.from(instant);

A java.util.Date인스턴스(instance)는 시간대 개념이 없다.전화하면 이상하게 보일지도 몰라.toString()에서java.util.Date왜냐하면toString시간대에 상대적이다.그러나 그 방법은 실제로 문자열을 제공하기 위해 자바의 기본 시간대를 즉시 사용한다.는 十津川(시가지)의 .java.util.Date.

Instant또한 시간대에 대한 정보는 포함되지 않는다.따라서, 변환하기 위해Instant현지 날짜 시간까지 표준 시간대를 지정해야 한다.이 될 수도 있다.ZoneId.systemDefault()- 또는 사용자 기본 설정에서 표준 시간대처럼 응용 프로그램이 제어하는 표준 시간대일 수 있음.LocalDateTime즉석 및 시간대를 모두 사용할 수 있는 편리한 공장 방식:

Date in = new Date();
LocalDateTime ldt = LocalDateTime.ofInstant(in.toInstant(), ZoneId.systemDefault());

The는LocalDateTime표준 시간대는 다음 시간대를 지정한다.atZone(ZoneId)방법의ZonedDateTime그런 다음 직접 으로 변환될 수 있다.Instant:

LocalDateTime ldt = ...
ZonedDateTime zdt = ldt.atZone(ZoneId.systemDefault());
Date output = Date.from(zdt.toInstant());

변환 로부터의 한다.LocalDateTimeZonedDateTime예상치 못한 행동을 일으킬 가능성이 있다.일광 절약 시간제로 인해 모든 현지 날짜 시간이 존재하지 않기 때문이다.가을/가을에는 동일한 지역 날짜/시간이 두 번 발생하는 지역 시간대에 중복이 있다.봄에는 한 시간이 사라지는 틈이 있다.변환이 수행할 작업에 대한 자세한 정의는 의 Javadoc을 참조하십시오.

요약, 왕복하는 경우java.util.Date완전히LocalDateTime그리고 다시 a로 돌아가다.java.util.Date일광 절약 시간제로 인해 다른 순간으로 끝날 수도 있다.

추가 정보:아주 오래된 날짜에 영향을 미칠 또 다른 차이점이 있다. java.util.Date1582년 10월 15일에 변경되는 달력을 사용하고 그 이전의 날짜는 그레고리력 대신 율리우스 달력을 사용한다.대조적으로,java.time.*항상 ISO 캘린더 시스템(양력과 동일)을 사용한다.대부분의 사용 사례에서 ISO 달력 시스템은 원하는 것이지만 1582년 이전 날짜를 비교할 때 이상한 효과를 볼 수 있다.

여기 내가 생각해낸 것이 있다 (그리고 모든 날짜 시간 문제처럼 그것은 아마도 이상한 시간대-리프년 주간 조명 조정 :D)에 근거하여 반증될 것이다.

라운드 트립:Date<<->>LocalDateTime

주어진:Date date = [some date]

(1)LocalDateTime<<Instant<<Date

    Instant instant = Instant.ofEpochMilli(date.getTime());
    LocalDateTime ldt = LocalDateTime.ofInstant(instant, ZoneOffset.UTC);

(2)Date<<Instant<<LocalDateTime

    Instant instant = ldt.toInstant(ZoneOffset.UTC);
    Date date = Date.from(instant);

예:

주어진:

Date date = new Date();
System.out.println(date + " long: " + date.getTime());

(1)LocalDateTime<<Instant<<Date:

만들다Instant로부터Date:

Instant instant = Instant.ofEpochMilli(date.getTime());
System.out.println("Instant from Date:\n" + instant);

만들다Date로부터Instant(필요하지는 않지만, 예시를 위해):

date = Date.from(instant);
System.out.println("Date from Instant:\n" + date + " long: " + date.getTime());

만들다LocalDateTime로부터Instant

LocalDateTime ldt = LocalDateTime.ofInstant(instant, ZoneOffset.UTC);
System.out.println("LocalDateTime from Instant:\n" + ldt);

(2)Date<<Instant<<LocalDateTime

만들다Instant로부터LocalDateTime:

instant = ldt.toInstant(ZoneOffset.UTC);
System.out.println("Instant from LocalDateTime:\n" + instant);

만들다Date로부터Instant:

date = Date.from(instant);
System.out.println("Date from Instant:\n" + date + " long: " + date.getTime());

출력:

Fri Nov 01 07:13:04 PDT 2013 long: 1383315184574

Instant from Date:
2013-11-01T14:13:04.574Z

Date from Instant:
Fri Nov 01 07:13:04 PDT 2013 long: 1383315184574

LocalDateTime from Instant:
2013-11-01T14:13:04.574

Instant from LocalDateTime:
2013-11-01T14:13:04.574Z

Date from Instant:
Fri Nov 01 07:13:04 PDT 2013 long: 1383315184574

기본 표준 시간대가 필요한 경우 훨씬 편리한 방법:

Date d = java.sql.Timestamp.valueOf( myLocalDateTime );

을 위한 가장 빠른 방법LocalDateTime->Date다음과 같은 경우:

Date.from(ldt.toInstant(ZoneOffset.UTC))

새로운 API LocalDateTime에서 java.util.date로 변환할 때 다음이 작동하는 것 같다.

Date.from(ZonedDateTime.of({time as LocalDateTime}, ZoneId.systemDefault()).toInstant());

역변환도 비슷한 방법으로 ...할 수 있다.

그게 도움이 되길 바래...

모든 것이 여기에 있다: http://blog.progs.be/542/date-to-java-time

"원형 트립"이라는 대답은 정확하지 않다: 할 때

LocalDateTime ldt = LocalDateTime.ofInstant(instant, ZoneOffset.UTC);

시스템 표준시가 UTC/GMT가 아닌 경우 시간을 변경하십시오!

만약 당신이 안드로이드에 있고 threatenbp를 사용한다면 당신은 사용할 수 있다.DateTimeUtils대신에

ex:

Date date = DateTimeUtils.toDate(localDateTime.atZone(ZoneId.systemDefault()).toInstant());

사용할 수 없음Date.fromapi 26+에서만 지원되므로

이것이 가장 간단한 방법인지 아니면 최선의 방법인지, 함정이 있는지는 잘 모르겠지만, 그것은 효과가 있다.

static public LocalDateTime toLdt(Date date) {
    GregorianCalendar cal = new GregorianCalendar();
    cal.setTime(date);
    ZonedDateTime zdt = cal.toZonedDateTime();
    return zdt.toLocalDateTime();
}

static public Date fromLdt(LocalDateTime ldt) {
    ZonedDateTime zdt = ZonedDateTime.of(ldt, ZoneId.systemDefault());
    GregorianCalendar cal = GregorianCalendar.from(zdt);
    return cal.getTime();
}

나는 아래의 접근방식이 시간대를 고려하지 않고 전환을 해결할 것이라고 생각한다.어떤 함정이 있는지 의견을 제시하십시오.

    LocalDateTime datetime //input
    public static final DateTimeFormatter yyyyMMddHHmmss_DATE_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    String formatDateTime = datetime.format(yyyyMMddHHmmss_DATE_FORMAT);
    Date outputDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(formatDateTime); //output

참조URL: https://stackoverflow.com/questions/19431234/converting-between-java-time-localdatetime-and-java-util-date

반응형