답변:
하여 Timestamp
, 나는 당신이 의미하는 가정 java.sql.Timestamp
. 이 클래스에는 long
인수 를 허용하는 생성자가 있습니다. DateFormat
클래스를 사용하여 이것을 구문 분석 할 수 있습니다 .
DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
Date date = dateFormat.parse("23/09/2007");
long time = date.getTime();
new Timestamp(time);
java.util.Date
, java.util.Calendar
그리고 java.text.SimpleDateFormat
지금 기존 에 의해 대체, java.time의 나중에 자바 8에 내장 된 클래스. Oracle의 Tutorial 을 참조하십시오 .
이건 어때?
java.sql.Timestamp timestamp = java.sql.Timestamp.valueOf("2007-09-23 10:10:10.0");
타임 스탬프는 무엇을 의미합니까? Unix 시대 이후의 밀리 초를 의미하는 경우 :
GregorianCalendar cal = new GregorianCalendar(2007, 9 - 1, 23);
long millis = cal.getTimeInMillis();
실제 java.sql.Timestamp 객체를 원하는 경우 :
Timestamp ts = new Timestamp(millis);
Calendar.SEPTEMBER
java.sql.Timestamp.from (
LocalDate.of ( 2007 , 9 , 23 )
.atStartOfDay( ZoneId.of ( "America/Montreal" ) )
.toInstant()
)
Java 8 이상에 내장 된 java.time 프레임 워크를 사용하여 코드를 표시하여이 페이지를 업데이트하겠습니다 .
이 새로운 클래스는 JSR 310에 의해 정의되고 ThreeTen-Extra 프로젝트에 의해 확장 된 Joda-Time 에서 영감을 받았습니다 . 그들은 Java의 초기 버전과 함께 번들로 제공되는 악명 높을 정도로 성가신 오래된 날짜-시간 클래스를 대체합니다.
java.time에서 an Instant
은 UTC 타임 라인의 한 순간입니다. A ZonedDateTime
는 시간대 ( ZoneId
) 로 조정 된 순간 입니다.
여기서 시간대가 중요합니다. 의 날짜는 September 23, 2007
시간대를 적용하지 않고 타임 라인의 순간으로 변환 할 수 없습니다. 아직“어제”인 몬트리올보다 파리에서 새로운 날이 더 일찍 시작된다고 생각해보십시오.
또한 java.sql.Timestamp는 날짜와 시간을 모두 나타냅니다. 따라서 날짜와 함께 이동하려면 시간을 입력해야합니다. 하루 중 첫 번째 순간을 시간으로 원한다고 가정합니다. 00:00:00.0
일광 절약 시간제 및 기타 예외로 인해 항상 시간이되는 것은 아닙니다 .
이전 java.util.Date 클래스와 달리 Joda-Time과 달리 java.time 유형의 해상도는 밀리 초가 아닌 나노초입니다. 이것은 java.sql.Timestamp의 해상도와 일치합니다.
java.sql.Timestamp는 toString
메소드 를 통해 문자열 표현을 생성 할 때 JVM의 현재 기본 시간대를 날짜-시간 값에 암시 적으로 적용하는 고약한 습관을 가지고 있습니다. 여기에 내 America/Los_Angeles
시간대가 적용되어 있습니다. 대조적으로, java.time 클래스는 표준 ISO 8601 형식을 사용하여 더 정상적 입니다.
LocalDate d = LocalDate.of ( 2007 , 9 , 23 ) ;
ZoneId z = ZoneId.of ( "America/Montreal" ) ;
ZonedDateTime zdt = d.atStartOfDay( z ) ;
Instant instant = zdt.toInstant() ;
java.sql.Timestamp ts = java.sql.Timestamp.from ( instant ) ;
콘솔에 덤프합니다.
System.out.println ( "d: " + d + " = zdt: " + zdt + " = instant: " + instant + " = ts: " + ts );
실행할 때.
d : 2007-09-23 = zdt : 2007-09-23T00 : 00-04 : 00 [아메리카 / 몬트리올] = 인스턴트 : 2007-09-23T04 : 00 : 00Z = ts : 2007-09-22 21:00 : 00.0
그런데 JDBC 4.2부터 java.time 유형을 직접 사용할 수 있습니다. 필요 없음java.sql.Timestamp
.
PreparedStatement.setObject
ResultSet.getObject
java.time의 프레임 워크는 나중에 자바 8에 내장되어 있습니다. 이 수업은 귀찮은 노인을 대체합니다. 기존 과 같은 날짜 - 시간의 수업을 java.util.Date
, Calendar
, SimpleDateFormat
.
그만큼 Joda 타임 프로젝트는 지금에 유지 관리 모드 의로 마이그레이션을 조언 java.time의 클래스.
자세한 내용은 Oracle Tutorial을 참조하십시오 . 그리고 많은 예제와 설명을 위해 Stack Overflow를 검색하십시오. 사양은 JSR 310 입니다.
java.time을 교환 할 수 있습니다. 객체를 데이터베이스와 직접 . JDBC 4.2 이상을 준수 하는 JDBC 드라이버를 사용하십시오 . 문자열이나 클래스 가 필요하지 않습니다 .java.sql.*
java.time 클래스는 어디서 구할 수 있습니까?
ThreeTen - 추가 프로젝트 추가 클래스와 java.time를 확장합니다. 이 프로젝트는 java.time에 향후 추가 될 수있는 가능성을 입증하는 곳입니다. 당신은 여기에 몇 가지 유용한 클래스와 같은 찾을 수 있습니다 Interval
, YearWeek
, YearQuarter
, 그리고 더 .
다음을 수행 할 수도 있습니다.
// untested
Calendar cal = GregorianCalendar.getInstance();
cal.set(Calendar.DAY_OF_MONTH, 23);// I might have the wrong Calendar constant...
cal.set(Calendar.MONTH, 8);// -1 as month is zero-based
cal.set(Calendar.YEAR, 2009);
Timestamp tstamp = new Timestamp(cal.getTimeInMillis());
API 에 따르면 연도, 월 등을 허용하는 생성자는 더 이상 사용되지 않습니다. 대신 long을 허용하는 Constructor를 사용해야합니다. 달력 구현을 사용하여 원하는 날짜를 구성하고 예를 들어 getTimeInMillis 메소드 를 사용하여 긴 시간 표시에 액세스 할 수 있습니다 .
완전성을 위해 Joda-Time 버전 2.5 및 해당 DateTime
클래스 의 솔루션 :
new Timestamp(new DateTime(2007, 9, 23, 0, 0, DateTimeZone.forID( "America/Montreal" )).getMillis())
DateTime
객체에 적용됩니다 . 즉, 결과는 호스트 OS 또는 JVM 설정의 다양한 컴퓨터 또는 구성에 따라 달라질 수 있습니다 . 예측 가능한 결과를 얻으려면 해당 DateTime
생성자에 시간대를 전달하십시오 . 픽 적절한 시간대 이름 당신의 의도에 대한합니다. 예를 들어, DateTimeZone.forID( "America/Montreal" )
또는 DateTimeZone.UTC
.
DateTime
객체에 밀리 초 이후의 에포크를 물어보십시오 . 교체 .toDate().getTime()
와 함께 .getMillis()
.
DateTimeZone.getDefault()
하십시오. (그나저나, Locale.getDefault()
선택 인수의 모호성에 대한 동일한 문제입니다.)
보다 일반적인 대답은 import입니다 . 현재 날짜와 동일하게 java.util.Date
설정해야하는 경우 timestamp
간단히 new Date()
.