TimeStamp를 Java에서 날짜로 변환하는 방법은 무엇입니까?


105

dateJava에서 카운트를 얻은 후 'timeStamp'를 어떻게 변환 합니까?

내 현재 코드는 다음과 같습니다.

public class GetCurrentDateTime {

    public int data() {
        int count = 0;
        java.sql.Timestamp timeStamp = new Timestamp(System.currentTimeMillis());
        java.sql.Date date = new java.sql.Date(timeStamp.getTime()); 
        System.out.println(date);
        //count++;

        try {
            Class.forName("com.mysql.jdbc.Driver");
            Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/pro", "root", "");

            PreparedStatement statement = con.prepareStatement("select * from orders where status='Q' AND date=CURDATE()");
            ResultSet result = statement.executeQuery();
            while (result.next()) {
                // Do something with the row returned.
                count++; //if the first col is a count.
            }
        } catch (Exception exc) {
            System.out.println(exc.getMessage());
        }

        return count;
    }
}

이것은 내 데이터베이스입니다. 여기에 이미지 설명 입력

여기서 내가 얻은 출력은 2012-08-07 0이지만 동등한 쿼리는 3을 반환합니다. 왜 0을 얻습니까?



테이블 데이터의 예를 보여줄 수 있습니까?
oldrinb 2012-08-07

date (1344255451,1344255537,1344312502) 및 status have (Q, Q, Q)
Krishna Veni


이 질문의 제목은 붉은 청어 입니다. 진짜 문제는 PreparedStatement잘못된 구문 으로 a 를 잘못 사용하는 것 입니다. SQL 문자열의 텍스트에 Java 변수를 포함 할 수 없습니다. 대신 ?SQL 문자열에 임베드 한 다음 set메서드를 호출하여 값을 PreparedStatement에 전달하십시오. Sujay 의 정확한 답변tenorsax의 답변을 참조하십시오 .
Basil Bourque 2015

답변:


188

Date스탬프의 getTime()값을 매개 변수로 사용하여 새 개체를 만드십시오 .

다음은 예제입니다 (현재 시간의 예제 타임 스탬프 사용).

Timestamp stamp = new Timestamp(System.currentTimeMillis());
Date date = new Date(stamp.getTime());
System.out.println(date);

@ vs06 더 이상 사용되지 않는다고 생각하는 이유는 무엇입니까? 최신 Java 7 및 8 문서는 모두 그렇지 않습니다 ( docs.oracle.com/javase/7/docs/api/java/util/Date.html#getTime ()docs.oracle.com/javase/8/docs/api /java/util/Date.html#getTime-- )
알렉스 콜맨

4
타임 스탬프 시간대와 JVM 시간대가 다른 경우 잘못된 결과가 생성됩니다.
로버트 Mugattarov

예를 들어 14.03.2014로 포맷하는 방법은 무엇입니까?
shurrok

6
나는 ppl이 그들의 대답에 라이브러리를 사용할 때 싫어하고 모든 사람들이 그것들을 가져 오는 방법을 알기를 기대합니다 : /
Sodj

38
// timestamp to Date
long timestamp = 5607059900000; //Example -> in ms
Date d = new Date(timestamp );

// Date to timestamp
long timestamp = d.getTime();

//If you want the current timestamp :
Calendar c = Calendar.getInstance();
long timestamp = c.getTimeInMillis();

왜 1000을 곱 했나요?
Sharpless512

3
날짜 초기화는 밀리 초 단위이고 타임 스탬프는 초 단위이기 때문입니다! 다른 모든 변환에 대해서도 동일하게 생각하십시오! 맛있어요?
VincentLamoute


7

나는 오랫동안 이것을 찾고 있었는데 Eposh 변환기 가 쉽게 수행한다는 것이 밝혀졌습니다 .

long epoch = new java.text.SimpleDateFormat("MM/dd/yyyy HH:mm:ss").parse("01/01/1970 01:00:00").getTime() / 1000;

또는 그 반대 :

String date = new java.text.SimpleDateFormat("MM/dd/yyyy HH:mm:ss").format(new java.util.Date (epoch*1000));

6

tl; dr

LocalDate.now( ZoneId.of( "Africa/Tunis" ) )
    .atStartOfDay( ZoneId.of( "Africa/Tunis" ) )
    .toEpochSecond()

LocalDate.now( ZoneId.of( "Africa/Tunis" ) )
    .plusDays( 1 )
    .atStartOfDay( ZoneId.of( "Africa/Tunis" ) )
    .toEpochSecond()

"SELECT * FROM orders WHERE placed >= ? AND placed < ? ; "

myPreparedStatement.setObject( 1 , start )
myPreparedStatement.setObject( 2 , stop )

java.time

최신 java.time 클래스로 대체되어 현재 레거시가 된 성가신 오래된 날짜 시간 클래스를 사용하고 있습니다.

분명히 당신은 데이터베이스에 정수 유형의 열에 순간을 저장하고 있습니다. 그것은 불행한 일입니다. 대신 SQL-standard와 같은 유형의 열을 사용해야합니다 TIMESTAMP WITH TIME ZONE. 그러나이 답변을 위해 우리는 우리가 가진 것을 가지고 일할 것입니다.

기록이 밀리 초 단위의 순간을 나타내며 하루 종일 모든 기록을 원하면 시간 범위가 필요합니다. 우리는 시작 순간과 중지 순간이 있어야합니다. 쿼리에는 쌍을 가져야하는 단일 날짜-시간 기준 만 있습니다.

LocalDate클래스는 시간이 하루의 시간 영역없이없이 날짜 만 값을 나타냅니다.

시간대는 날짜를 결정하는 데 중요합니다. 주어진 순간에 날짜는 지역별로 전 세계적으로 다릅니다. 예를 들어, 파리 에서 자정 이후 몇 분이 지나면 프랑스몬트리올 퀘벡 에서는 여전히 '어제'인 새로운 날 입니다.

시간대가 지정되지 않은 경우 JVM은 현재 기본 시간대를 내재적으로 적용합니다. 이 기본값은 언제든지 변경 될 수 있으므로 결과가 다를 수 있습니다. 원하는 / 예상 시간대를 명시 적으로 인수로 지정하는 것이 좋습니다.

지정 적절한 시간대 이름 의 형식 continent/region예컨대, America/Montreal, Africa/Casablanca, 또는 Pacific/Auckland. EST또는 IST과 같은 3-4 자 약어 는 표준 시간대 가 아니고 , 표준화되지 않았으며, 고유하지도 않은 (!)이므로 사용하지 마십시오.

ZoneId z = ZoneId.of( "America/Montreal" ) ;  
LocalDate today = LocalDate.now( z ) ;

JVM의 현재 기본 시간대를 사용하려면 요청하고 인수로 전달하십시오. 생략하면 JVM의 현재 기본값이 암시 적으로 적용됩니다. JVM 내의 모든 앱 스레드에있는 코드에 의해 런타임 중에 언제든지 기본값이 변경 될 수 있으므로 명시 적으로 지정하는 것이 좋습니다.

ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.

또는 날짜를 지정하십시오. 월을 숫자로 설정할 수 있으며 1 월부터 12 월까지 1 ~ 12 번의 정상적인 번호를 지정할 수 있습니다.

LocalDate ld = LocalDate.of( 1986 , 2 , 23 ) ;  // Years use sane direct numbering (1986 means year 1986). Months use sane numbering, 1-12 for January-December.

또는 Month연중 매월 하나씩 미리 정의 된 열거 형 개체를 사용하는 것이 좋습니다 . 팁 : Month단순한 정수 대신 코드베이스 전체에서 이러한 객체를 사용하여 코드를보다 자체적으로 문서화하고 유효한 값을 보장하며 유형 안전성을 제공하십시오 .

LocalDate ld = LocalDate.of( 1986 , Month.FEBRUARY , 23 ) ;

A를 LocalDate손에, 우리는 다음 필요가 순간 하루의 시작과 정지 한 쌍으로 그 변환합니다. 하루가 시간이 00:00:00에 시작된다고 가정하지 마십시오. 일광 절약 시간 (DST)과 같은 예외로 인해 하루가 01:00:00과 같은 다른 시간에 시작될 수 있습니다. 따라서 java.time이 하루의 첫 번째 순간을 결정하도록합니다. 우리는 그러한 이상을 찾기 위해 ZoneId인수를 전달합니다 LocalDate::atStartOfDay. 결과는 ZonedDateTime.

ZonedDateTime zdtStart = ld.atStartOfDay( z ) ;

일반적으로 시간 범위를 정의하는 가장 좋은 방법은 시작은 포함 하고 끝은 배타적 인 Half-Open 접근 방식 입니다 . 따라서 하루는 첫 번째 순간부터 시작하여 다음 날의 첫 번째 순간까지 이어집니다.

ZonedDateTime zdtStop = ld.plusDays( 1 ).atStartOfDay( z ) ;  // Determine the following date, and ask for the first moment of that day.

하루 종일 쿼리는 SQL 명령을 사용할 수 없습니다 BETWEEN. 이 명령은 완전히 닫힘 ( []) (시작과 끝 모두 포함)이며 반 개방 ( [))을 원합니다 . 한 쌍의 기준 >=<.

열 이름이 잘못되었습니다. 다양한 데이터베이스에서 예약 한 천 단어를 피하십시오. placed이 예 에서 사용합시다 .

코드는 ?순간을 지정 하는 자리 표시자를 사용해야합니다 .

String sql = "SELECT * FROM orders WHERE placed >= ? AND placed < ? ; " ;

그러나 우리는 ZonedDateTime객체를 가지고 있고, 데이터베이스는 위에서 논의한 것처럼 정수를 저장하고 있습니다. 당신이 경우 당신의 열을 정의 제대로 우리는 간단하게 전달할 수 ZonedDateTime나중에 JDBC 4.2을 지원하는 모든 JDBC 드라이버 객체.

그러나 대신에 우리는 전체 초 단위로 epoch로부터 카운트를 얻어야합니다. 나는 당신의 epoch 기준 날짜가 UTC로 1970 년의 첫 번째 순간이라고 가정 할 것입니다. ZonedDateTime클래스는 나노초 해상도를 지원 하므로 데이터 손실 가능성에주의하십시오 . 분수 초는 다음 줄에서 잘립니다.

long start = zdtStart().toEpochSecond() ;  // Transform to a count of whole seconds since 1970-01-01T00:00:00Z.
long stop = zdtStop().toEpochSecond() ; 

이제 위에서 정의한 SQL 코드에이 정수를 전달할 준비가되었습니다.

PreparedStatement ps = con.prepareStatement( sql );
ps.setObject( 1 , start ) ;
ps.setObject( 2 , stop ) ;
ResultSet rs = ps.executeQuery();

에서 정수 값을 검색 할 때 객체 (항상 UTC) 또는 객체 (지정된 시간대) ResultSet로 변환 할 수 있습니다 .InstantZonedDateTime

Instant instant = rs.getObject(  , Instant.class ) ;
ZonedDateTime zdt = instant.atZone( z ) ;

java.time 정보

java.time의 프레임 워크는 나중에 자바 8에 내장되어 있습니다. 이 클래스는 까다로운 기존에 대신 기존 과 같은 날짜 - 시간의 수업을 java.util.Date, Calendar, SimpleDateFormat.

Joda 타임 프로젝트는 지금에 유지 관리 모드 의로 마이그레이션을 조언 java.time의 클래스.

자세한 내용은 Oracle Tutorial을 참조하십시오 . 그리고 많은 예제와 설명을 위해 Stack Overflow를 검색하십시오. 사양은 JSR 310 입니다.

java.time 클래스는 어디서 구할 수 있습니까?

ThreeTen - 추가 프로젝트 추가 클래스와 java.time를 확장합니다. 이 프로젝트는 java.time에 향후 추가 될 수있는 가능성을 입증하는 곳입니다. 당신은 여기에 몇 가지 유용한 클래스와 같은 찾을 수 있습니다 Interval, YearWeek, YearQuarter, 그리고 .


4

우선 .NET Framework를 사용하는 이점을 활용하고 있지 않습니다 PreparedStatement. 먼저 PreparedStatement다음과 같이 수정하는 것이 좋습니다 .

PreparedStatement statement = con.prepareStatement("select * from orders where status=? AND date=?")

그런 다음을 사용 statement.setXX(param_index, param_value)하여 각 값을 설정할 수 있습니다 . 로 변환 timestamp하려면 다음 javadocs를 살펴보십시오.

PreparedStatement.setTimeStamp ()
타임 스탬프

도움이 되었기를 바랍니다!


4

Android에서는 매우 간단합니다. Calender 클래스를 사용하여 currentTimeMillis를 가져옵니다.

Timestamp stamp = new Timestamp(Calendar.getInstance().getTimeInMillis());
Date date = new Date(stamp.getTime());
Log.d("Current date Time is   "  +date.toString());

Java에서는 System.currentTimeMillis ()를 사용하여 현재 타임 스탬프를 얻습니다.


3

쿼리에서 무엇을 선택하려고하는지 확실하지 않지만 UNIX_TIMESTAMP()인수 없이는 지금 시간을 반환합니다. 인수로 유효한 시간을 제공하거나 조건을 변경해야합니다.

편집하다:

다음은 질문에 기반한 시간 제한 쿼리의 예입니다.

PreparedStatement statement = con
        .prepareStatement("select * from orders where status='Q' AND date > ?");
Date date = new SimpleDateFormat("dd/MM/yyyy").parse("01/01/2000");
statement.setDate(1, new java.sql.Date(date.getTime()));

편집 : 타임 스탬프 열

타임 스탬프 사용 java.sql.TimestampPreparedStatement.setTimestamp ()의 경우 , 즉 :

PreparedStatement statement = con
        .prepareStatement("select * from orders where status='Q' AND date > ?");
Date date = new SimpleDateFormat("dd/MM/yyyy").parse("01/01/2000");
Timestamp timestamp = new Timestamp(date.getTime());
statement.setTimestamp(1, timestamp);

이제 내 조건은 select * from xcart_orders where status = 'Q'AND date = CURDATE (). now also displays zero only
Krishna Veni

@krishnaveni 어떤 레코드를 선택하려고합니까?
tenorsax

date (11111111,123456767,122333344) 및 status = (Q, Q, Q) .. all은 내 데이터베이스에 저장됩니다. 이제 쿼리를 확인하고 카운트 값을 가져 와서 콘솔에 표시하고 싶습니다. datas는 복귀 후 카운트 값을 일치
크리슈나 왔노을

@krishnaveni 결과 집합을 특정 날짜로 묶으려면 쿼리에서 해당 날짜를 사용하고 그렇지 않으면 날짜 조건을 제거하십시오.
tenorsax

내 코드에서 날짜가 내 데이터베이스에 저장된 yyyy-mm-dd 형식이면 성공적으로 작동합니다. 하지만 이제 내 날짜는이 1343469690 형식의 타임 스탬프에 저장됩니다. ? 어떻게 내가 여기에 코드를 작성 얼마나 카운트 값을 얻을 수있다
크리슈나 왔노을

3

new Date(timestamp.getTime())작동해야하지만 새로운 멋진 Java 8 방식 (더 우아하고 형식에 안전 할뿐만 아니라 새로운 시간 클래스를 사용하도록 유도 할 수 있음)은를 호출하는 것 Date.from(timestamp.toInstant())입니다.

( Timestamp자체가의 인스턴스 라는 사실에 의존하지 마십시오 . 다른 답변Date 의 설명에있는 설명을 참조하십시오 .)


3
    Timestamp tsp = new Timestamp(System.currentTimeMillis());
   java.util.Date dateformat = new java.util.Date(tsp.getTime());

3

다른 답변은 실제 응용 프로그램이 감당할 수없는 시간대에 구애받지 않는 것처럼 보이기 때문에 응답해야한다고 생각합니다. 타임 스탬프와 JVM이 다른 시간대를 사용할 때 타임 스탬프-날짜 변환을 올바르게하려면 다음과 같이 Joda Time의 LocalDateTime (또는 Java8의 LocalDateTime)을 사용할 수 있습니다.

Timestamp timestamp = resultSet.getTimestamp("time_column");
LocalDateTime localDateTime = new LocalDateTime(timestamp);
Date trueDate = localDateTime.toDate(DateTimeZone.UTC.toTimeZone());

아래의 예에서는 타임 스탬프가 UTC라고 가정합니다 (일반적으로 데이터베이스의 경우). 타임 스탬프가 다른 시간대에있는 경우 toDate문의 timezone 매개 변수를 변경합니다 .


2

이 자바 코드를 사용해보십시오.

Timestamp stamp = new Timestamp(System.currentTimeMillis());
Date date = new Date(stamp.getTime());
DateFormat f = new SimpleDateFormat("yyyy-MM-dd");
DateFormat f1 = new SimpleDateFormat("yyyy/MM/dd");
String d = f.format(date);
String d1 = f1.format(date);
System.out.println(d);
System.out.println(d1);

0

기존 항목이 있다고 가정합니다 java.util.Date date.

Timestamp timestamp = new Timestamp(long);
date.setTime( l_timestamp.getTime() );

0

이 방법을 사용하여 특정 지역의 타임 스탬프 및 시간대에서 날짜를 가져올 수 있습니다.

public String getDayOfTimestamp(long yourLinuxTimestamp, String timeZone) {
    Calendar cal = Calendar.getInstance();
    cal.setTimeInMillis(yourLinuxTimestamp * 1000);
    cal.setTimeZone(TimeZone.getTimeZone(timeZone));
    Date date = cal.getTime();
}

-1
String timestamp="";
Date temp=null;
try {
    temp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(getDateCurrentTimeZone(Long.parseLong(timestamp)));
} catch (ParseException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
int dayMonth=temp.getDate();
int dayWeek=temp.getDay();
int hour=temp.getHours();
int minute=temp.getMinutes();
int month=temp.getMonth()+1;
int year=temp.getYear()+1900;

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.