programing

java.util을 변환합니다.java.time 날짜로컬 날짜

prostudy 2022. 6. 4. 08:10
반응형

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는 "날짜"가 아닌 타임라인상의 순간을 나타냅니다.개체 내에 저장된 실제 데이터는long1970-01-01T00:00Z(1970 GMT/UTC 시작 자정) 이후의 밀리초 수.

동등한 클래스java.util.DateJSR-310에서는Instant그래서 편리한 방법이 있다.toInstant()변환을 제공합니다.

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

A java.util.Dateinstance에는 타임존 개념이 없습니다.전화하면 이상하게 보일 수 있어요.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

반응형