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.Date
java.util.Calendar
그리고java.text.SimpleDateFormat
Java가 처음 출시하고 진화했을 때 수업은 너무 빨리 진행되었다.그 수업들은 잘 설계되거나 실행되지 않았다.개선은 시도되었고, 따라서 당신이 찾아낸 낙제점들이었습니다.불행히도 개선의 시도는 대부분 실패했다.이런 수업은 아예 피해야 한다.그들은 자바 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 SE 8, Java SE 9, Java SE 10, Java SE 11 및 이후 버전 - 번들 구현이 포함된 표준 Java API의 일부.
- 자바 9는 몇 가지 사소한 특징과 수정 사항을 가지고 왔다.
- Java SE 6 및 Java SE 7
- 대부분의 Java.time 기능은 스리텐 백포트에서 Java 6 & 7로 백포트된다.
- 안드로이드
- 이후 버전의 Android(26+) 번들 구현 Java.time 클래스.
- 이전의 Android (<26)의 경우, 최신 Android 툴링은 API disugaring이라고 알려진 프로세스가 Android에 원래 내장되어 있지 않은 Java.time 기능의 하위 집합을 제공할 수 있게 한다.
- 디제게어링이 필요한 것을 제공하지 않으면, 스리텐ABP 프로젝트는 스리텐 백포트(위에서 언급함)를 안드로이드에 적응시킨다.ThreeTenABP 사용 방법을 참조하십시오.
인 특정Date
생성자가 더 이상 사용되지 않으며,Calendar
대신 사용해야 한다.그JavaDoc
for 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
그래서 당신의 샘플 코드는 당신이 기대했던 대로 되지 않을 것이다.그리고 그 부분이 핵심이다.
대체적으로 더Date
API는 현대적인 서부 달력만 지원하고, 특이하게 지정된 구성요소를 가지고 있으며, 필드를 설정할 경우 비일관적으로 동작한다.
그Calendar
그리고GregorianCalendar
가 APIga보다 .Date
Java 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 이전 방식)
'programing' 카테고리의 다른 글
JPA @Column 주석을 참조하여 insertable=false 및 updateable=false에 대해 설명하십시오. (0) | 2022.04.14 |
---|---|
드롭다운 목록에서 확인란을 선택한 후 v-자동 완성(복수) 검색 입력을 지우는 방법 (0) | 2022.04.14 |
JUnit를 사용하여 비동기 프로세스를 테스트하는 방법 (0) | 2022.04.13 |
Java에서 메서드를 비동기식으로 호출하는 방법 (0) | 2022.04.13 |
getter(Vuex)에서 상태를 호출할 때 정의되지 않음 (0) | 2022.04.13 |