날짜가 2007 년 9 월 23 일인 타임 스탬프는 어떻게 만들 수 있습니까?
답변
하여 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.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);
답변
tl; dr
java.sql.Timestamp.from (
LocalDate.of ( 2007 , 9 , 23 )
.atStartOfDay( ZoneId.of ( "America/Montreal" ) )
.toInstant()
)
java.time
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 정보
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 클래스는 어디서 구할 수 있습니까?
- 자바 SE 8 , 자바 SE 9 , 자바 SE 10 , Java SE 11 이상 -번들로 구현 된 표준 Java API의 일부입니다.
- Java 9에는 몇 가지 사소한 기능과 수정 사항이 추가되었습니다.
- Java SE 6 및 Java SE 7
- 대부분의 java.time 기능은 ThreeTen-Backport 에서 Java 6 및 7로 백 포트됩니다. .
- 기계적 인조 인간
- 최신 버전의 Android 번들 구현 java.time 클래스 .
- 이전 Android (<26)의 경우 ThreeTenABP 프로젝트는 ThreeTen-Backport (위에서 언급)를 채택합니다 . ThreeTenABP 사용 방법…을 참조하십시오 .
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 메소드 를 사용하여 긴 시간 표시에 액세스 할 수 있습니다 .