나는 C # 세계에서 왔으므로 아직 Java에 익숙하지 않습니다. 나는 Date
더 이상 사용되지 않는 Eclipse에 의해 들었다 .
Person p = new Person();
p.setDateOfBirth(new Date(1985, 1, 1));
왜? 그리고 대신 (특히 위와 같은 경우) 무엇을 사용해야합니까?
나는 C # 세계에서 왔으므로 아직 Java에 익숙하지 않습니다. 나는 Date
더 이상 사용되지 않는 Eclipse에 의해 들었다 .
Person p = new Person();
p.setDateOfBirth(new Date(1985, 1, 1));
왜? 그리고 대신 (특히 위와 같은 경우) 무엇을 사용해야합니까?
답변:
특정 Date
생성자는 더 이상 사용되지 않으므로 Calendar
대신 사용해야합니다. JavaDoc
에 대한 날짜 생성자가 사용되지되는과를 사용하여 교체하는 방법에 대해 설명합니다 Calendar
.
java.util.Date
, java.util.Calendar
그리고 java.text.SimpleDateFormat
지금 기존 에 의해 대체, java.time의 나중에 자바 8에 내장 된 클래스. Oracle의 Tutorial 을 참조하십시오 .
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();
Javadoc 날짜를 살펴보십시오.
http://download.oracle.com/javase/6/docs/api/java/util/Date.html
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone(<timezone id>));
java.time.*
경우 코드를 변경하는 경우 클래스가 더 나은 옵션입니다.
LocalDate.of( 1985 , 1 , 1 )
…또는…
LocalDate.of( 1985 , Month.JANUARY , 1 )
java.util.Date
, java.util.Calendar
그리고 java.text.SimpleDateFormat
자바가 처음 출시 진화 할 때 클래스는 너무 빨리 돌진했다. 수업은 잘 설계되거나 구현되지 않았습니다. 개선이 시도되었으므로 더 이상 사용되지 않습니다. 불행히도 개선 시도는 크게 실패했습니다. 당신은해야 이러한 클래스를 피하기 전부. 그것들은 새로운 클래스에 의해 Java 8에서 대체됩니다.
java.util.Date에는 날짜와 시간 부분이 있습니다. 코드에서 시간 부분을 무시했습니다. 따라서 Date 클래스는 JVM의 기본 시간대에 정의 된대로 하루의 시작 시간을 가져 와서 해당 시간을 Date 객체에 적용합니다. 따라서 코드 결과는 실행되는 시스템 또는 시간대에 따라 다릅니다. 아마 당신이 원하는 것이 아닙니다.
생년월일과 같이 시간 부분이없는 날짜 만 원하는 경우 Date
개체 를 사용하지 않을 수 있습니다 . ISO 8601 형식의 날짜 문자열 만 저장할 수 있습니다 YYYY-MM-DD
. 또는 LocalDate
Joda-Time 의 객체를 사용 하십시오 (아래 참조).
Java에서 가장 먼저 배울 사항 : Java와 함께 번들로 제공되는 악명 높은 java.util.Date & java.util.Calendar 클래스는 피하십시오 .
로 올바르게에서 언급 user3277382으로 대답 , 사용 중 Joda 타임 또는 새로운 java.time. * 패키지 자바 8.
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
. 그런 다음 Immutable Objects 패턴을 사용하여 이전 객체의 동일한 순간 ( epoch 이후 나노초 수 )을 기반으로하지만 다른 시간대가 지정된 새로운 날짜-시간을 만듭니다 . 마지막으로 LocalDate
날짜 나 시간대가없는 날짜를 얻지 만 해당 날짜를 결정할 때 시간대가 적용됩니다 (예 : 새로운 날짜는 오슬로 에서 뉴욕 보다 새벽에 더 일찍 나타납니다 ).
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의 프레임 워크는 나중에 자바 8에 내장되어 있습니다. 이 클래스는 까다로운 기존에 대신 기존 과 같은 날짜 - 시간의 수업을 java.util.Date
, Calendar
, SimpleDateFormat
.
Joda 타임 프로젝트는 지금에 유지 관리 모드 의로 마이그레이션을 조언 java.time의 클래스.
자세한 내용은 Oracle Tutorial을 참조하십시오 . 많은 예제와 설명을 보려면 스택 오버플로를 검색하십시오. 사양은 JSR 310 입니다.
java.time 객체를 데이터베이스와 직접 교환 할 수 있습니다 . JDBC 4.2 이상을 준수 하는 JDBC 드라이버를 사용하십시오 . 문자열이 필요없고 수업이 필요 없습니다 .java.sql.*
java.time 클래스는 어디서 구할 수 있습니까?
ThreeTen - 추가 프로젝트 추가 클래스와 java.time를 확장합니다. 이 프로젝트는 향후 java.time에 추가 될 수있는 입증 된 근거입니다. 당신은 여기에 몇 가지 유용한 클래스와 같은 찾을 수 있습니다 Interval
, YearWeek
, YearQuarter
, 그리고 더 .
생성자가 더 이상 사용되지 않는 한 가지 이유는 year 매개 변수의 의미가 예상과 다르기 때문입니다. 자바 독은 말한다 :
JDK 버전 1.1 현재로 대체되었습니다
Calendar.set(year + 1900, month, date)
.
연도 필드는 이후의 연도 수 1900
이므로 샘플 코드는 예상대로 작동하지 않을 수 있습니다. 그리고 그게 요점입니다.
일반적으로 Date
API는 최신 서부 달력 만 지원하며, 고유하게 지정된 구성 요소를 가지고 있으며, 필드를 설정하면 일관성이 없습니다.
Calendar
및 GregorianCalendar
API는 더 나은보다 Date
, 및 제 3 자 Joda 시간 API는 일반적으로 최선을 것으로 생각되었다. 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
더 이상 사용되지 않습니다. 그것은 단지 많은 방법입니다. 자세한 내용은 여기를 참조하십시오 .
java.util.Calendar
대신 사용하십시오 .
대부분의 Java 개발자는 현재 타사 패키지 Joda-Time을 사용 합니다. 훨씬 더 나은 구현으로 널리 알려져 있습니다.
그러나 Java 8 에는 새로운 java.time. * 패키지가 있습니다. JDK 8 용 새 날짜 및 시간 API 소개 기사를 참조하십시오 .
Date 생성자가 더 이상 사용되지 않으므로이 코드를 사용해 볼 수 있습니다.
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
Date
및 Calendar
2019에서 것은 좋지 조언이다.
binnyb이 제안한 것과 유사하게 최신 Calendar> GregorianCalendar 메소드 사용을 고려할 수 있습니다. 더 최근의 문서를보십시오 :
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
Instant
와 ZonedDateTime
.
Date 생성자는 1900 년 이후의 연도 형식 (0부터 시작하는 달, 1부터 시작하는 날짜)으로 시간을 예상하며시 / 분 / 초 / 밀리 초를 0으로 설정합니다.
Date result = new Date(year, month, day);
더 이상 사용되지 않는 Date 생성자에 대해 달력 교체 (0 년, 0 개월, 1 일)를 사용하려면 다음과 같은 것이 필요합니다.
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));
new GregorianCalendar(1985, Calendar.JANUARY, 1).getTime();
(자바 -8 이전 방식)