programing

Java: 날짜 생성자가 더 이상 사용되지 않는 이유와 내가 대신 사용하는 것은?

prostudy 2022. 4. 13. 21:01
반응형

Java: 날짜 생성자가 더 이상 사용되지 않는 이유와 내가 대신 사용하는 것은?

나는 C#세계에서 왔기 때문에 아직 자바에 대한 경험이 많지 않다.방금 이클립스로부터 이런 말을 들었다.Date사용되지 않음:

Person p = new Person();
p.setDateOfBirth(new Date(1985, 1, 1));

왜? 그리고 (특히 위와 같은 경우) 무엇을 대신 사용해야 하는가?

java.util.Date클래스는 실제로 더 이상 사용되지 않으며, 단지 두 명의 다른 생성자와 함께 더 이상 사용되지 않는 생성자만 더 이상 사용되지 않는다.그것은 국제화와 잘 맞지 않기 때문에 더 이상 사용되지 않았다.Calendar클래스를 대신 사용해야 함:

Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 1988);
cal.set(Calendar.MONTH, Calendar.JANUARY);
cal.set(Calendar.DAY_OF_MONTH, 1);
Date dateRepresentation = cal.getTime();

자바독의 날짜를 보십시오.

http://download.oracle.com/javase/6/docs/api/java/util/Date.html

tl;dr

LocalDate.of( 1985 , 1 , 1 )

…혹은…

LocalDate.of( 1985 , Month.JANUARY , 1 )

세부 사항

java.util.Datejava.util.Calendar그리고java.text.SimpleDateFormatJava가 처음 출시하고 진화했을 때 수업은 너무 빨리 진행되었다.그 수업들은 잘 설계되거나 실행되지 않았다.개선은 시도되었고, 따라서 당신이 찾아낸 낙제점들이었습니다.불행히도 개선의 시도는 대부분 실패했다.이런 수업은 아예 피해야 한다.그들은 자바 8에서 새로운 수업으로 대체된다.

코드의 문제

java.util.날짜는 날짜와 시간 부분을 모두 가지고 있다.코드에서 시간 부분을 무시하셨습니다.따라서 날짜 클래스는 JVM의 기본 표준 시간대에 의해 정의된 대로 하루의 시작을 사용하고 그 시간을 날짜 개체에 적용한다.따라서 코드의 결과는 코드의 실행 기계나 시간대를 설정하는 기계에 따라 달라진다.아마 네가 원하는 건 아닐 거야

생년월일과 같이 시간 부분을 제외하고 날짜만 원한다면, 당신은 a를 사용하지 않으려 할 수 있다.Date이의를 제기하다날짜의 문자열만 ISO 8601 형식으로 저장하십시오.YYYY-MM-DD. 또는 Joda-Time의 개체를 사용하십시오(아래 참조).

조다 타임

Java에서 가장 먼저 배워야 할 사항:문제가 있는 것으로 악명 높은 Java.util을 피하십시오.Date & Java.util.Java와 함께 번들로 제공되는 일정관리 클래스.

user3277382의 답변에서 올바르게 설명한 대로 Joda-Time 또는 새로운 Java.Time을 사용하십시오.* Java 8의 패키지.

Joda-Time 2.3의 코드 예

DateTimeZone timeZoneNorway = DateTimeZone.forID( "Europe/Oslo" );
DateTime birthDateTime_InNorway = new DateTime( 1985, 1, 1, 3, 2, 1, timeZoneNorway );

DateTimeZone timeZoneNewYork = DateTimeZone.forID( "America/New_York" );
DateTime birthDateTime_InNewYork = birthDateTime_InNorway.toDateTime( timeZoneNewYork ); 

DateTime birthDateTime_UtcGmt = birthDateTime_InNorway.toDateTime( DateTimeZone.UTC );

LocalDate birthDate = new LocalDate( 1985, 1, 1 );

콘솔로 덤프...

System.out.println( "birthDateTime_InNorway: " + birthDateTime_InNorway );
System.out.println( "birthDateTime_InNewYork: " + birthDateTime_InNewYork );
System.out.println( "birthDateTime_UtcGmt: " + birthDateTime_UtcGmt );
System.out.println( "birthDate: " + birthDate );

실행 시…

birthDateTime_InNorway: 1985-01-01T03:02:01.000+01:00
birthDateTime_InNewYork: 1984-12-31T21:02:01.000-05:00
birthDateTime_UtcGmt: 1985-01-01T02:02:01.000Z
birthDate: 1985-01-01

자바.시간

이 경우 Java.time의 코드는 Joda-time의 코드와 거의 동일하다.

시간대()ZoneId를 구해서 그 시간대()에 할당된 날짜-시간 객체를 구성한다.ZonedDateTime그런 다음 Imable Objects 패턴을 사용하여 기존 객체의 동일한 순간(epoch 이후 나노초 수)을 기반으로 하지만 다른 시간대를 할당하여 새로운 날짜/시간을 생성한다.마지막으로, 우리는 그 날짜를 결정할 때 시간대가 적용됨을 알기는 하지만 시간대와 시간대가 없는 시간대를 얻는다(를 들어 오슬로에서는 뉴욕보다 더 일찍 새로운 날이 밝는다).

ZoneId zoneId_Norway = ZoneId.of( "Europe/Oslo" );
ZonedDateTime zdt_Norway = ZonedDateTime.of( 1985 , 1 , 1 , 3 , 2 , 1 , 0 , zoneId_Norway );

ZoneId zoneId_NewYork = ZonedId.of( "America/New_York" );
ZonedDateTime zdt_NewYork = zdt_Norway.withZoneSameInstant( zoneId_NewYork );

ZonedDateTime zdt_Utc = zdt_Norway.withZoneSameInstant( ZoneOffset.UTC );  // Or, next line is similar.
Instant instant = zdt_Norway.toInstant();  // Instant is always in UTC.

LocalDate localDate_Norway = zdt_Norway.toLocalDate();

java.time 정보

자바.시간 프레임워크는 Java 8 이상에 내장되어 있다.이러한 수업은 , , & 같은 골치 아픈 오래된 레거시 날짜-시간 수업을 대체한다.

자세한 내용은 Oracle 자습서를 참조하십시오.그리고 스택 오버플로를 검색하여 많은 예와 설명을 참조하십시오.사양은 JSR 310이다.

현재 유지보수 모드에 있는 조다 타임 프로젝트는 Java.time 클래스로의 마이그레이션을 권고한다.

Java.time 객체를 데이터베이스와 직접 교환할 수 있다.JDBC 4.2 이상과 호환되는 JDBC 드라이버를 사용하십시오.끈이 필요 없고, 끈이 필요 없다.java.sql.*최대 절전 모드 5 & JPA 2.2는 Java.time을 지원한다.

Java.time 클래스를 가져올 위치

Java 또는 Android 버전과 함께 사용할 Java.time 라이브러리 표

인 특정Date생성자가 더 이상 사용되지 않으며,Calendar대신 사용해야 한다.JavaDocfor Date는 어떤 생성자가 더 이상 사용되지 않는지, 그리고 다음을 사용하여 이들을 교체하는 방법을 설명한다.Calendar.

나는 이 질문을 비논리적인 방법으로 무엇을 얻을 수 있는지 물어보는 새로운 질문의 복제품으로 접하게 되었다.Date특정한 해, 월, 일에서.

지금까지 나온 답은 '이걸로'를 쓰라고 한다.Calendar수업, 그리고 그것은 자바 8이 나오기 전까지는 사실이었다.그러나 자바 8을 기준으로 표준적인 방법은 다음과 같다.

LocalDate localDate = LocalDate.of(1985, 1, 1);

그리고 만약 당신이 정말로 필요로 한다면java.util.Date이 질문의 제안을 사용할 수 있다.

자세한 내용은 API 또는 Java 8 튜토리얼을 참조하십시오.

시공자가 더 이상 사용되지 않는 한 가지 이유는 연도 매개변수의 의미가 여러분이 기대하는 바가 아니기 때문이다.자바독은 다음과 같이 말한다.

JDK 버전 1.1에서 다음으로 교체됨Calendar.set(year + 1900, month, date).

연도 필드는 이후 경과된 연도 수라는 점에 유의하십시오.1900그래서 당신의 샘플 코드는 당신이 기대했던 대로 되지 않을 것이다.그리고 그 부분이 핵심이다.

대체적으로 더DateAPI는 현대적인 서부 달력만 지원하고, 특이하게 지정된 구성요소를 가지고 있으며, 필드를 설정할 경우 비일관적으로 동작한다.

Calendar그리고GregorianCalendar가 APIga보다 .DateJava 8에서는, 그들이 소개한 것은java.time패키지, 그리고 이것들은 이제 권장되는 대안이 되었다.

참고하십시오.Calendar.getTime()주간 시간 부분이 현재 시간으로 기본 설정된다는 점에서 비결정론적이다.

재생성하려면 다음 코드를 두어 번 실행해 보십시오.

Calendar c = Calendar.getInstance();
c.set(2010, 2, 7); // NB: 2 means March, not February!
System.err.println(c.getTime());

출력 예:

Sun Mar 07 10:46:21 CET 2010

몇 분 후 정확히 동일한 코드를 실행하면 다음과 같은 결과가 나온다.

Sun Mar 07 10:57:51 CET 2010

그래서, 그러는 동안set()해당 필드가 값을 수정하도록 강제하면 다른 필드의 시스템 시간이 누출된다.(위에서 Sun jdk6 & jdk7로 테스트됨)

Date그 자체는 더 이상 사용되지 않는다.그냥 많은 방법들이 그렇답니다.자세한 내용은 여기를 참조하십시오.

대신 쓰세요.

대부분의 자바 개발자들은 현재 제3자 패키지 Joda-Time을 사용하고 있다.그것은 훨씬 더 나은 시행으로 널리 간주되고 있다.

그러나 Java 8은 새로운 Java.time을 갖게 될 것이다.* 패키지.JDK 8에 대한 새로운 날짜 및 시간 API 소개 기사를 참조하십시오.

날짜 생성자가 더 이상 사용되지 않으므로 이 코드를 사용해 보십시오.

import java.util.Calendar;

  Calendar calendar = Calendar.getInstance();
     calendar.set(Calendar.HOUR_OF_DAY, 6);// for 6 hour
     calendar.set(Calendar.MINUTE, 0);// for 0 min
     calendar.set(Calendar.SECOND, 0);// for 0 sec
     calendar.set(1996,0,26);// for Date [year,month(0 to 11), date]

    Date date = new Date(calendar.getTimeInMillis());// calendar gives long value

    String mConvertedDate = date.toString();// Fri Jan 26 06:00:00 GMT+05:30 1996

날짜 생성자는 1900년 이후 연도를 0개월, 1일 단위로 예상하고 시간/분/초/밀리초를 0으로 설정한다.

Date result = new Date(year, month, day);

따라서 더 이상 사용되지 않는 날짜 생성자에 대해 캘린더 교체(0-based years, 0-based months, 1-based days)를 사용하면 다음과 같은 작업이 필요하며,

Calendar calendar = Calendar.getInstance();
calendar.clear(); // Sets hours/minutes/seconds/milliseconds to zero
calendar.set(year + 1900, month, day);
Date result = calendar.getTime();

또는 Java 1.8(연도가 0이고 월과 일수가 1인):

Date result = Date.from(LocalDate.of(year + 1900, month + 1, day).atStartOfDay(ZoneId.systemDefault()).toInstant());

다음은 Date, Calendar 및 Java 1.8의 동일한 버전:

int year = 1985; // 1985
int month = 1; // January
int day = 1; // 1st

// Original, 1900-based year, zero-based month, one-based day
Date date1 = new Date(year - 1900, month - 1, day);

// Calendar, zero-based year, zero-based month, one-based day
Calendar calendar = Calendar.getInstance();
calendar.clear(); // Sets hours/minutes/seconds/milliseconds to zero
calendar.set(year, month - 1, day);
Date date2 = calendar.getTime();

// Java-time back to Date, zero-based year, one-based month, one-based day
Date date3 = Date.from(LocalDate.of(year, month, day).atStartOfDay(ZoneId.systemDefault()).toInstant());

SimpleDateFormat format = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss.SSS");

// All 3 print "1985-Jan-01 00:00:00.000"
System.out.println(format.format(date1));
System.out.println(format.format(date2));
System.out.println(format.format(date3));

binnyb가 제안한 것과 유사하게, 당신은 새로운 캘린더 > 그레고리칼렌다르 방법의 사용을 고려할 수 있다.다음 최신 문서를 참조하십시오.

http://download.oracle.com/javase/6/docs/api/java/util/GregorianCalendar.html

같은 방법을 만들 수 있다.new Date(year,month,date)을 사용함으로써 당신의 코드로Calendar계급의

private Date getDate(int year,int month,int date){
    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.YEAR, year);
    cal.set(Calendar.MONTH, month-1);
    cal.set(Calendar.DAY_OF_MONTH, day);
    return cal.getTime();
}

그것은 의 더 이상 사용되지 않는 건설자처럼 작동할 것이다.Date

자바에 대한 보안 코드 가이드라인에서 얻은 정보 입니다.

이 섹션의 예제는 java.util을 사용한다.변경 가능한 API 클래스의 예인 만큼 광범위하게 날짜 지정.애플리케이션에서는 새로운 Java Date 및 Time API(java.time)를 사용하는 것이 바람직하다.*) 불변하도록 설계되었다.

new GregorianCalendar(1985, Calendar.JANUARY, 1).getTime();

(자바-8 이전 방식)

참조URL: https://stackoverflow.com/questions/5677470/java-why-is-the-date-constructor-deprecated-and-what-do-i-use-instead

반응형