[java] 자바 타임 스탬프-날짜가 2007 년 9 월 23 일인 타임 스탬프는 어떻게 만들 수 있습니까?

날짜가 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 클래스는 어디서 구할 수 있습니까?

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())