2016-07-25 16 views
2

私はjavaで単純な文字列から日付への変換を行っていますが、気になる変換を行う必要があるのはGMTでなければなりません。 GMTで文字列を変換できます。しかし、その日付をタイムスタンプに変換しようとすると、私は別の価値を持っていました(私のローカルタイムゾーンに基づいているようです)。Java日付タイムスタンプ変換の問題

public static void timeFun(String str) throws ParseException { 
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); 
    String dateInString = "2015-07-10T09:54:31.000-04:00"; 
    Date date = formatter.parse(dateInString); 

    SimpleDateFormat sdfAmerica = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); 
    TimeZone tz = TimeZone.getTimeZone("GMT"); 
    sdfAmerica.setTimeZone(tz); 

    String convertedDate = sdfAmerica.format(date); // Convert to String 
                // first 
    Date dateInGMT = sdfAmerica.parse(convertedDate); 
    System.out.println(convertedDate); // Output = 2015-07-10T13:54:31.000Z (Right) 
    Timestamp timestamp = new java.sql.Timestamp(dateInGMT.getTime()); 

    System.out.println(timestamp); // Output = 2015-07-10 19:24:31.0 (Wrong) 

} 
+0

日付とタイムスタンプのクラスは、タイムゾーンを持っていない - 彼らは唯一のエポックからのミリ秒数を表します。それらのtoStringメソッドは、あなたのマシンの設定に基づいていくつかの変換を行うかもしれませんが、オブジェクトの内部状態には影響しません。タイムスタンプを使用する場合は、おそらくデータベースと対話したいと思うでしょうし、データベース列にタイムゾーンがある場合、結果は期待どおりになります(13:54GMTまたはそれに相当する瞬間)。 – assylias

答えて

0

このコードは、私のために正常に動作している:

public static Timestamp convertStringToTimestamp(String strRaw) throws ParseException 
    { 
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); 
    String dateInString = strRaw; 
    Date date = formatter.parse(dateInString); 
    TimeZone gmtTime = TimeZone.getTimeZone("GMT"); 
    formatter.setTimeZone(gmtTime); 
    Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT")); 
    calendar.setTime(date); 
    SimpleDateFormat formatter1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS"); 

    Timestamp t = new Timestamp(formatter1.parse(formatter.format(calendar.getTime())).getTime()); 

    System.out.println("********"+new Date(t.getTime())); 
    return new Timestamp(formatter1.parse(formatter.format(calendar.getTime())).getTime()); 

    } 
2

Timestamp.toString()内部デフォルトのシステムタイムゾーンでカレンダーインスタンスを使用しています。あなたがソースコードjava.util.Date.normalize()で見ることができるように、魔法を行います。 だから、はい...最後のシステム出力はあなたのローカルタイムゾーンに基づいています。

2

アレクサンダーの答えは正しいです。

java.time

は、これらの古い日付時刻クラスはひどい混乱しています。彼らのJavaDocで提案されているように、それらを避けてください。それらはjava.timeフレームワークに取って代わられています。

OffsetDateTime odt = OffsetDateTime.parse("2015-07-10T09:54:31.000-04:00"); 

UTC(GMT)を取得するには、Instantを抽出します。

Instant instant = odt.toInstant(); 

ZoneIdを適用し、特定の時間帯のレンズを通して同じ瞬間を参照します。

ZoneId zoneId = ZoneId.of("America/Montreal"); 
ZonedDateTime zdt = instant.atZone(zoneId); 

これはすべてスタックオーバーフローで何度もカバーされています。

関連する問題