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


답변:


154

하여 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);

1
일반적인 ISO 날짜 형식은 yyyy-MM-dd이며 그렇지 않으면 좋습니다!
vidstige

1
new Timestamp (시간); 긴 값을 취하는 이와 같은 생성자가 없다는 오류를 제공합니다 :(
Bhanu Sharma

1
@Bhanu 문서는 이것이 긴 값을 취하고 올바르게 작동하는 것처럼 보인다는 것을 보여줍니다 : docs.oracle.com/javase/7/docs/api/java/sql/…
Hazok dec

참고로, 같은 몹시 귀찮은 된 날짜 - 시간 수업 java.util.Date, java.util.Calendar그리고 java.text.SimpleDateFormat지금 기존 에 의해 대체, java.time의 나중에 자바 8에 내장 된 클래스. Oracle의 Tutorial 참조하십시오 .
Basil Bourque

121

이건 어때?

java.sql.Timestamp timestamp = java.sql.Timestamp.valueOf("2007-09-23 10:10:10.0");

1
Timestamp timestamp = Timestamp.valueOf ( "2007-09-23 10 : 10 : 10.0"); valueOf 메소드를 도시하는 JDK 7 종류 타임 스탬프 미정이다
인 Ashish 라탄

new Timestamp (시간); 다음과 같은 생성자가 문자열 값을 취하지 않는다는 오류를 제공합니다. (
Bhanu Sharma

@Bhanu 생성자는 밀리 초 단위의 유닉스 시간을 사용합니다. 문자열에서 타임 스탬프를 얻으려면 정적 메서드 valueOf를 사용합니다.
Hazok 2014

4
이것은 질문에 대한 최선의 대답 인 것 같습니다.
Hazok

1
가장 좋은 답변은 더 이상 사용되지 않는 Date이며 사용하는 것은 좋지 않습니다. 이 답변이 더 좋습니다. 주셔서 감사합니다
Alberici

18

타임 스탬프는 무엇을 의미합니까? Unix 시대 이후의 밀리 초를 의미하는 경우 :

GregorianCalendar cal = new GregorianCalendar(2007, 9 - 1, 23);
long millis = cal.getTimeInMillis();

실제 java.sql.Timestamp 객체를 원하는 경우 :

Timestamp ts = new Timestamp(millis);

2
잘못되어 컴파일되지 않습니다! 컴파일 오류 : 09는 8 진수이지만 9는 8 진수 범위를 벗어납니다. 논리 오류 : 월이 0부터 시작하면 2007 년 10 월 23 일
user85421

컴파일되지 않으면 논리 오류가 발생하지 않습니다. :) 진지하게, 좋은 캐치, Carlos. 내가 전에 잡았지만 어쨌든 잘못 붙여 넣은 8 진수. :(
Matthew Flaschen 09-06-10

실제로 타임 스탬프 생성자가 depricated 오히려 당신은 Timestamp.valueOf () 메소드를 사용할 수 있습니다
시바 Komuravelly

@ShivaKomuravelly 모든 타임 스탬프 생성자가 더 이상 사용되지 않는 것은 아니며 최소한 밀리 초가 걸리지 않습니다. 날짜를 인수로 사용하는 생성자는 더 이상 사용되지 않습니다
이름 없음

그리고 그것에 대한 상수가 있습니다 (월 = 9 대신) :Calendar.SEPTEMBER
Guillaume Husta

11

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, 그리고 .


3
나는 당신의 대답을 올바른 것으로 표시하기 위해 OP 또는 개조를 어떻게 얻을 수 있는지 궁금합니다. 받아 들여지는 대답은 너무 구식입니다.
sttaq

오타를 제외하고는 아주 좋습니다. asStartOfDay ()는 atStartOfDay () 여야합니다.
Tullochgorum

@Tullochgorum 고정. 감사. 참고로 Stack Overflow에서 원하는 경우 직접 편집 할 수 있습니다.
Basil Bourque

5

다음을 수행 할 수도 있습니다.

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

2
잘못된 : 결과의 System.out.println을 시도하십시오! 다음과 같이 표시됩니다. "2009-10-23 15 : 26 : 56.171"월은 0 기반이므로 9는 10 월입니다!
user85421

저는 그 상수 중 하나가 0부터 시작한다는 것을 알고있었습니다. 감사합니다. 게시물이 업데이트되었습니다.
Alex

1
아, 그리고 'untested'를 넣었습니다. :)
Alex

4

API 에 따르면 연도, 월 등을 허용하는 생성자는 더 이상 사용되지 않습니다. 대신 long을 허용하는 Constructor를 사용해야합니다. 달력 구현을 사용하여 원하는 날짜를 구성하고 예를 들어 getTimeInMillis 메소드 를 사용하여 긴 시간 표시에 액세스 할 수 있습니다 .


1

완전성을 위해 Joda-Time 버전 2.5 및 해당 DateTime클래스 의 솔루션 :

new Timestamp(new DateTime(2007, 9, 23, 0, 0, DateTimeZone.forID( "America/Montreal" )).getMillis())

1
좋은 대답이지만 중요한 부분 인 시간대 를 놓쳤습니다 . 시간대를 생략하면 JVM의 현재 기본 시간대가 DateTime객체에 적용됩니다 . 즉, 결과는 호스트 OS 또는 JVM 설정의 다양한 컴퓨터 또는 구성에 따라 달라질 수 있습니다 . 예측 가능한 결과를 얻으려면 해당 DateTime생성자에 시간대를 전달하십시오 . 픽 적절한 시간대 이름 당신의 의도에 대한합니다. 예를 들어, DateTimeZone.forID( "America/Montreal" )또는 DateTimeZone.UTC.
Basil Bourque 2014 년

이 코드는 더 짧을 수 있습니다. milliseconds-since- epoch 를 가져오고 전달하기 위해 java.util.Date로 변환 할 필요가 없습니다 . DateTime객체에 밀리 초 이후의 에포크를 물어보십시오 . 교체 .toDate().getTime()와 함께 .getMillis().
Basil Bourque 2014 년

@BasilBourque 상황에 따라 예측 가능한 결과를 얻기 위해 시간대를 생략 할 수 있습니다. "현재 시간대"는 완벽하게 합리적이고 예측 가능한 결과가 될 수 있습니다. 시간대를 하드 코딩하거나 컴퓨터에 이미 시간대가 설정되어 있는데 사용자에게 수동으로 시간대를 설정하도록 요청하는 이유는 무엇입니까? 내 컴퓨터의 응용 프로그램이 미국 / 몬트리올 시간대로 조정 된 날짜를 출력하기 시작하면 확실히 놀랄 것입니다.
댄 카터

@dancarter 선택적 시간대를 생략하면 혼동이 생깁니다. 생략은 (a) 프로그래머가 암시 적 기본값에 의존하려고했는지 또는 (b) 프로그래머가 표준 시간대 문제를 고려하지 않았는지 (모두 너무 흔하게)의 모호성을 높입니다. 실제로 JVM의 현재 기본 시간대 를 사용하려면 결과를 선택적 인수로 호출 하고 전달하여 명시 적으로 말DateTimeZone.getDefault() 하십시오. (그나저나, Locale.getDefault()선택 인수의 모호성에 대한 동일한 문제입니다.)
Basil Bourque

-1

보다 일반적인 대답은 import입니다 . 현재 날짜와 동일하게 java.util.Date설정해야하는 경우 timestamp간단히 new Date().


** 날짜 ( "문자열"); **이되지 않습니다
인 Ashish 라탄을
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.