java.util을 변환합니다.java.time 날짜로컬 날짜
를 변환하는 가장 좋은 방법은 무엇입니까?java.util.Date
새로운 JDK 8/JSR-310에 대한 오브젝트java.time.LocalDate
?
Date input = new Date();
LocalDate date = ???
단답
Date input = new Date();
LocalDate date = input.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
설명.
이름에도 불구하고java.util.Date
는 "날짜"가 아닌 타임라인상의 순간을 나타냅니다.개체 내에 저장된 실제 데이터는long
1970-01-01T00:00Z(1970 GMT/UTC 시작 자정) 이후의 밀리초 수.
동등한 클래스java.util.Date
JSR-310에서는Instant
그래서 편리한 방법이 있다.toInstant()
변환을 제공합니다.
Date input = new Date();
Instant instant = input.toInstant();
A java.util.Date
instance에는 타임존 개념이 없습니다.전화하면 이상하게 보일 수 있어요.toString()
에서java.util.Date
왜냐하면toString
는 시간대에 상대적입니다.그러나 이 메서드는 실제로 문자열을 제공하기 위해 Java의 기본 시간대를 즉시 사용합니다.타임존은 실제 상태의 일부가 아닙니다.java.util.Date
.
안Instant
에는 타임존에 대한 정보도 포함되어 있지 않습니다.즉, RSA에서 변환하려면Instant
표준 시간대를 지정해야 합니다.이것이 기본 존일 수 있습니다.ZoneId.systemDefault()
- 사용자 설정에서 시간대 등 응용 프로그램이 제어하는 시간대일 수 있습니다.를 사용합니다.atZone()
표준 시간대를 적용하는 방법:
Date input = new Date();
Instant instant = input.toInstant();
ZonedDateTime zdt = instant.atZone(ZoneId.systemDefault());
A ZonedDateTime
현지 날짜, 시간대 및 GMT/UTC로부터의 오프셋으로 구성된 상태를 포함합니다.그 날짜로서:LocalDate
- 를 사용하여 쉽게 추출할 수 있습니다.toLocalDate()
:
Date input = new Date();
Instant instant = input.toInstant();
ZonedDateTime zdt = instant.atZone(ZoneId.systemDefault());
LocalDate date = zdt.toLocalDate();
Java 9의 답변
Java SE 9에서는 이 작업을 약간 단순화하는 새로운 방법이 추가되었습니다.
Date input = new Date();
LocalDate date = LocalDate.ofInstant(input.toInstant(), ZoneId.systemDefault());
이 새로운 대안은 보다 직접적이기 때문에 가비지를 줄일 수 있기 때문에 성능이 향상될 것입니다.
더 나은 방법은:
Date date = ...;
Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDate()
이 버전의 장점:
입력이 인스턴스인지 아닌지에 관계없이 동작합니다.
java.util.Date
또는 서브클래스의java.sql.Date
(@JodaStephen의 방식과는 다릅니다).이것은 JDBC에서 발신된 데이터에서는 공통입니다.java.sql.Date.toInstant()
항상 예외가 발생합니다.JSR-310 백포트를 사용하는 JDK8 및 JDK7도 마찬가지입니다.
개인적으로 유틸리티 클래스를 사용합니다(단, 백포트 호환성은 없습니다).
/**
* Utilities for conversion between the old and new JDK date types
* (between {@code java.util.Date} and {@code java.time.*}).
*
* <p>
* All methods are null-safe.
*/
public class DateConvertUtils {
/**
* Calls {@link #asLocalDate(Date, ZoneId)} with the system default time zone.
*/
public static LocalDate asLocalDate(java.util.Date date) {
return asLocalDate(date, ZoneId.systemDefault());
}
/**
* Creates {@link LocalDate} from {@code java.util.Date} or it's subclasses. Null-safe.
*/
public static LocalDate asLocalDate(java.util.Date date, ZoneId zone) {
if (date == null)
return null;
if (date instanceof java.sql.Date)
return ((java.sql.Date) date).toLocalDate();
else
return Instant.ofEpochMilli(date.getTime()).atZone(zone).toLocalDate();
}
/**
* Calls {@link #asLocalDateTime(Date, ZoneId)} with the system default time zone.
*/
public static LocalDateTime asLocalDateTime(java.util.Date date) {
return asLocalDateTime(date, ZoneId.systemDefault());
}
/**
* Creates {@link LocalDateTime} from {@code java.util.Date} or it's subclasses. Null-safe.
*/
public static LocalDateTime asLocalDateTime(java.util.Date date, ZoneId zone) {
if (date == null)
return null;
if (date instanceof java.sql.Timestamp)
return ((java.sql.Timestamp) date).toLocalDateTime();
else
return Instant.ofEpochMilli(date.getTime()).atZone(zone).toLocalDateTime();
}
/**
* Calls {@link #asUtilDate(Object, ZoneId)} with the system default time zone.
*/
public static java.util.Date asUtilDate(Object date) {
return asUtilDate(date, ZoneId.systemDefault());
}
/**
* Creates a {@link java.util.Date} from various date objects. Is null-safe. Currently supports:<ul>
* <li>{@link java.util.Date}
* <li>{@link java.sql.Date}
* <li>{@link java.sql.Timestamp}
* <li>{@link java.time.LocalDate}
* <li>{@link java.time.LocalDateTime}
* <li>{@link java.time.ZonedDateTime}
* <li>{@link java.time.Instant}
* </ul>
*
* @param zone Time zone, used only if the input object is LocalDate or LocalDateTime.
*
* @return {@link java.util.Date} (exactly this class, not a subclass, such as java.sql.Date)
*/
public static java.util.Date asUtilDate(Object date, ZoneId zone) {
if (date == null)
return null;
if (date instanceof java.sql.Date || date instanceof java.sql.Timestamp)
return new java.util.Date(((java.util.Date) date).getTime());
if (date instanceof java.util.Date)
return (java.util.Date) date;
if (date instanceof LocalDate)
return java.util.Date.from(((LocalDate) date).atStartOfDay(zone).toInstant());
if (date instanceof LocalDateTime)
return java.util.Date.from(((LocalDateTime) date).atZone(zone).toInstant());
if (date instanceof ZonedDateTime)
return java.util.Date.from(((ZonedDateTime) date).toInstant());
if (date instanceof Instant)
return java.util.Date.from((Instant) date);
throw new UnsupportedOperationException("Don't know hot to convert " + date.getClass().getName() + " to java.util.Date");
}
/**
* Creates an {@link Instant} from {@code java.util.Date} or it's subclasses. Null-safe.
*/
public static Instant asInstant(Date date) {
if (date == null)
return null;
else
return Instant.ofEpochMilli(date.getTime());
}
/**
* Calls {@link #asZonedDateTime(Date, ZoneId)} with the system default time zone.
*/
public static ZonedDateTime asZonedDateTime(Date date) {
return asZonedDateTime(date, ZoneId.systemDefault());
}
/**
* Creates {@link ZonedDateTime} from {@code java.util.Date} or it's subclasses. Null-safe.
*/
public static ZonedDateTime asZonedDateTime(Date date, ZoneId zone) {
if (date == null)
return null;
else
return asInstant(date).atZone(zone);
}
}
그asLocalDate()
여기서의 메서드는 null-safe이며, 사용toLocalDate()
입력이 다음과 같은 경우java.sql.Date
(타임존의 문제나 불필요한 계산을 피하기 위해 JDBC 드라이버에 의해 덮어쓰기 되는 경우가 있습니다).그렇지 않으면 상기의 방법을 사용합니다.
LocalDate localDate = LocalDate.parse( new SimpleDateFormat("yyyy-MM-dd").format(date) );
Java 8을 사용하고 있다면 @Joda Stephen의 답변이 분명 가장 좋습니다.단, JSR-310 백포트를 사용하는 경우에는 다음과 같은 작업을 수행해야 합니다.
Date input = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(input);
LocalDate date = LocalDate.of(cal.get(Calendar.YEAR),
cal.get(Calendar.MONTH) + 1,
cal.get(Calendar.DAY_OF_MONTH));
LocalDate ld = new java.sql.Date( new java.util.Date().getTime() ).toLocalDate();
한 줄로 변환할 수 있습니다.
public static LocalDate getLocalDateFromDate(Date date){
return LocalDate.from(Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()));
}
첫째, 날짜를 즉석으로 쉽게 변환할 수 있습니다.
Instant timestamp = new Date().toInstant();
그런 다음 Instant() 메서드를 사용하여 Instant를 jdk 8의 임의의 날짜 api로 변환할 수 있습니다.
LocalDateTime date = LocalDateTime.ofInstant(timestamp, ZoneId.systemDefault());
Date input = new Date();
LocalDateTime conv=LocalDateTime.ofInstant(input.toInstant(), ZoneId.systemDefault());
LocalDate convDate=conv.toLocalDate();
Date
(instance)에는 날짜와 시간이 되어 있지만 인스턴스(instance)에는 시간이 포함되어 있지 .LocalDate
그렇지 않다.은 이렇게 .LocalDateTime
ofInstant()
시간 없이 원하는 경우 인스턴스를 로 변환합니다.LocalDate
.
public static LocalDate Date2LocalDate(Date date) {
return LocalDate.parse(date.toString(), DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy"))
은 어학연수를 하다의 입니다.Date#tostring
public String toString() {
// "EEE MMM dd HH:mm:ss zzz yyyy";
BaseCalendar.Date date = normalize();
StringBuilder sb = new StringBuilder(28);
int index = date.getDayOfWeek();
if (index == BaseCalendar.SUNDAY) {
index = 8;
}
convertToAbbr(sb, wtb[index]).append(' '); // EEE
convertToAbbr(sb, wtb[date.getMonth() - 1 + 2 + 7]).append(' '); // MMM
CalendarUtils.sprintf0d(sb, date.getDayOfMonth(), 2).append(' '); // dd
CalendarUtils.sprintf0d(sb, date.getHours(), 2).append(':'); // HH
CalendarUtils.sprintf0d(sb, date.getMinutes(), 2).append(':'); // mm
CalendarUtils.sprintf0d(sb, date.getSeconds(), 2).append(' '); // ss
TimeZone zi = date.getZone();
if (zi != null) {
sb.append(zi.getDisplayName(date.isDaylightTime(), TimeZone.SHORT, Locale.US)); // zzz
} else {
sb.append("GMT");
}
sb.append(' ').append(date.getYear()); // yyyy
return sb.toString();
}
ThreeTen을 포함한 ThreeTen 백포트를 사용하는 경우ABP
Date input = new Date(); // Imagine your Date here
LocalDate date = DateTimeUtils.toInstant(input)
.atZone(ZoneId.systemDefault())
.toLocalDate();
310의 하고 있는 는, JSR 310이 경우, 310이 없는 경우,Date.toInstant()
않으면 않습니다.org.threeten.bp.Instant
더 많은 전환이 필요한 경우입니다. ''를 .DateTimeUtils
백포트의 일부로 제공되는 클래스입니다.나머지 변환은 동일합니다.설명도 마찬가지입니다.
JBoss EAP 6에서의 @JodaStephen 구현에 문제가 있어 http://docs.oracle.com/javase/tutorial/datetime/iso/legacy.html의 Oracle Java Tutorial에 따라 변환을 다시 작성했습니다.
Date input = new Date();
GregorianCalendar gregorianCalendar = (GregorianCalendar) Calendar.getInstance();
gregorianCalendar.setTime(input);
ZonedDateTime zonedDateTime = gregorianCalendar.toZonedDateTime();
zonedDateTime.toLocalDate();
이 간단한 한 줄에 무슨 문제가 있나요?
new LocalDateTime(new Date().getTime()).toLocalDate();
나는 아래의 해결책으로 이 문제를 해결했다.
import org.joda.time.LocalDate;
Date myDate = new Date();
LocalDate localDate = LocalDate.fromDateFields(myDate);
System.out.println("My date using Date" Nov 18 11:23:33 BRST 2016);
System.out.println("My date using joda.time LocalTime" 2016-11-18);
이 경우 localDate는 "yyy-MM-dd" 형식으로 날짜를 인쇄합니다.
언급URL : https://stackoverflow.com/questions/21242110/convert-java-util-date-to-java-time-localdate
'programing' 카테고리의 다른 글
keytool 오류 Keystore가 조작되었거나 암호가 잘못되었습니다. (0) | 2022.06.05 |
---|---|
vuelidate 참/거짓 확인 (0) | 2022.06.04 |
알려진 리소스 이름을 가진 리소스 ID를 가져오려면 어떻게 해야 합니까? (0) | 2022.06.04 |
난독화 C코드 콘테스트 2006.sykes 2.c에 대해 설명해 주세요. (0) | 2022.06.04 |
[Vue.js] Vuex에서의 네임스페이스 (0) | 2022.06.04 |