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
"날짜"가 아니라 타임라인에서 순간을 나타낸다.개체 내에 저장된 실제 데이터는long
00Z) .
에 해당하는 클래스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());
변환 로부터의 한다.LocalDateTime
로ZonedDateTime
예상치 못한 행동을 일으킬 가능성이 있다.일광 절약 시간제로 인해 모든 현지 날짜 시간이 존재하지 않기 때문이다.가을/가을에는 동일한 지역 날짜/시간이 두 번 발생하는 지역 시간대에 중복이 있다.봄에는 한 시간이 사라지는 틈이 있다.변환이 수행할 작업에 대한 자세한 정의는 의 Javadoc을 참조하십시오.
요약, 왕복하는 경우java.util.Date
완전히LocalDateTime
그리고 다시 a로 돌아가다.java.util.Date
일광 절약 시간제로 인해 다른 순간으로 끝날 수도 있다.
추가 정보:아주 오래된 날짜에 영향을 미칠 또 다른 차이점이 있다. java.util.Date
1582년 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.from
api 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
'Programing' 카테고리의 다른 글
요소-UI 열 필터에서 기본 필터 값을 설정하는 방법 (0) | 2022.04.18 |
---|---|
vue.js 구성 요소 템플릿에 소품이 있는지 확인하십시오. (0) | 2022.04.18 |
Axios 및 VueJS, 함수(응답)가 목록을 설정하지 않음 (0) | 2022.04.18 |
경로 매개 변수에 배치할 계산된 속성 항목에 개체 항목을 추가하는 방법 (0) | 2022.04.18 |
C에서 문자열을 올바르게 비교하려면 어떻게 해야 하는가? (0) | 2022.04.18 |