2012-03-30 3 views
3

자바에서 날짜가 파싱되는 방법에 대해 머리를 쓰려고 노력하고 있으며, 여전히 내가 대기하고있는 시간대에 관계없이 일관된 출력을 얻기 위해 매개 변수로 전달해야하는 것을 해결할 수없는 것 같습니다.SimpleDateFormatter 구문 분석이 다르게 작동합니까?

다음과 같은 출력 제공

import java.util.Date; 
import java.sql.Timestamp; 
import java.text.SimpleDateFormat; 
import java.text.DateFormat; 

public class TimeTest { 

public static void main(String [] args) throws Exception 
{ 

    String dateString = "2012-03-28 11:45:00 +0200"; 
    String dateString1 = "2012-03-28 11:45:00 +0000"; 
    Timestamp timestamp= null; 
    Timestamp timestamp1= null; 
    DateFormat planningDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z"); 
    Date date = planningDateFormat.parse(dateString); 
    Date date1 = planningDateFormat.parse(dateString1); 
    timestamp = new Timestamp(date.getTime()); 
    timestamp1 = new Timestamp(date1.getTime()); 
    System.out.println("Time value passed in was: " + dateString); 
    System.out.println("Date value after parse: " + date); 
    System.out.println("Time stamp value is: " + timestamp); 

    System.out.println("Time value passed in was: " + dateString1); 
    System.out.println("Date value after parse: " + date1); 
    System.out.println("Time stamp value is: " + timestamp1); 
} 
} 

:

나는이 테스트 클래스 작성

:

Time value passed in was: 2012-03-28 11:45:00 +0200 
Date value after parse: Wed Mar 28 10:45:00 IST 2012 
Time stamp value is: 2012-03-28 10:45:00.0 
Time value passed in was: 2012-03-28 11:45:00 +0000 
Date value after parse: Wed Mar 28 12:45:00 IST 2012 
Time stamp value is: 2012-03-28 12:45:00.0 
이제

날이의 이유 비를 설명하자 어떤 의미가 있습니다

첫 번째 날짜는 통과하고 오전 11시 45 분에 +0200 오프셋을 사용하고 아일랜드 표준시 10:45 인 IST를 제공합니다.

아무도 저에게 무슨 일이 일어나고 있는지 그리고 어떻게 결론에 도달했는지 설명 할 수 있습니까? 시간은 11:45이며, ​​UTC는 11:45 또는 현지 시간은 11:45입니다 (오프셋이 +0200 인 국가). 내가보기에 시간이 현지 시간을 나타내는 것처럼 보입니다.

또 다른 질문은 다음과 같습니다.
아일랜드에 거주하는 경우 겨울에는 +0000, 여름에는 +0100입니다. "Z"에 전달되는 값이 쿼리하는 날짜에 따라 변경됩니까? 또는 자바가 날짜와 함께 시간에 따라 자동으로 이것을 알아야하지 않을까요?

나는 실제로 무슨 일이 일어나는지 알지 못합니다.

+1

공정한 점 그러나 나는 변덕스러워하고 때로는 심지어 내 말을 어지럽히고 그걸 바꿨습니다. –

+0

걱정할 필요가 없습니다. BTW, IMHO 실독증이라는 단어를 생각한 사람은 새디스트 야. – Bohemian

답변

1

형식 패턴의 Z은 UTC의 절대 오프셋을 나타냅니다. 11:45:00 +0200라고 말하면, 이는 09:45:00 UTC으로 표시된 시간과 같습니다. 즉, 시간이 UTC 인 시간보다 2 시간 앞선 것입니다. IST는 UTC + 1이기 때문에 우리가 가진 :

11:45:00 +0200 == 09:45:00 UTC == 10:45:00 IST

당신이 시간대 별칭을 사용하는 경우 (예를 들어, Europe/Dublin를) 절대 오프셋 대신, 자바가 자동으로 일광을 처리합니다 당신이 제공 한 날짜 부분에 따라 절약 시간 규칙.

+0

내 컴퓨터에서 적어도 IST는 * 인도 *를 가리 킵니다. 아마도 Olson ID를 사용하면 나아지 다. –

+0

설명해 주셔서 감사합니다.하지만 Java에서 허용하는 표준 시간대 별칭 목록은 어디에서 찾을 수 있습니까? 그리고 그 질문에 무관하다는 것을 알고 있지만 JavaScript를 사용하여 어떻게 생성 할 수 있는지 알고 있습니까? (그런 식으로 존재한다면)? 왜냐하면 나는 사용자가 시간과 날짜를 선택할 수있게하고 싶기 때문에 날짜와 시간이 정확하게 파싱되도록 ​​시간대를 전달해야한다. –

+0

JVM에서 지원하는 ID를 가져 오려면 [TimeZone.getAvailableIDs()] (http://docs.oracle.com/javase/6/docs/api/java/util/TimeZone.html#getAvailableIDs())를 체크 아웃 할 수 있습니다. . –

0

예, 전달 된 시간은 현지 시간입니다. 2012-03-28 11:45:00 +0200라고 말하면 실제로 "UTC 기준 +02 : 00 시간대는 11:45"라고 말합니다. 그 다음 시간은 현지 시간으로 표시됩니다 (DST로 인해 UTC 기준 +01 : 00이므로 전달 된 시간에서 1 시간이 감됨).

날짜 메서드는 일광 절약 시간제를 적용합니다. 로컬 시스템 날짜를 변경하면 반환 된 시간도 변경됩니다. 또는 CDT, CST, MDT, MST 및 Date 클래스에서 지원하는 비슷한 timezome 문자열을 입력 해보십시오. 이들은 모두 일광 절약 시간을 알고 있습니다.

+0

시간/날짜는 컴퓨터 업계에서 큰 혼란입니다. –

+0

시리아 현지 시간 (11시 45 분 0 초)을 전달하고 싶다면 여름에는 +0300을 전달해야합니다 (여름에는 UTC int에서 +3 시간이므로), 겨울에는 +0200 시간차가 UTC에서 2 시간 밖에되지 않는 경우)? 저 주위를 돌아 다니기 위해 제가 할 수있는 일이 있습니까?날짜 또는 시간과 상관없이 날짜 또는 시간과 함께 오프셋 또는 시간대 값을 전달할 수 있습니까 (여름 이건 겨울 이건) –

관련 문제