2016-10-10 14 views
1

UTC文字列から現地時間帯の日付に変換メソッドを行っていますが、文字列と同じ日付が返されます。ここで何が間違っていますか?日付時間ゾーン変換

public static Date getUTCToDate(String utc){ 
    // String exampleOfUTCTime = "2016-09-27T19:35:32.717"; 

    try{ 
     Log.d("asd-timeBefore", "getUTCToDate: " + utc); 
     DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS"); 
     formatter.setTimeZone(TimeZone.getDefault()); 
     Date d = formatter.parse(utc); 
     Log.d("asd-timeAfter", "getUTCToDate: " + d); 
     return d; 
    } catch (ParseException e){ 
     e.printStackTrace(); 
    } 
    return null; 
} 
+1

フォーマッタのタイムゾーンが正しく設定されていません – xAqweRx

+0

希望するタイムゾーンのオフセットは? –

+0

アプリはさまざまな国で使用されるため、ローカルタイムゾーンを使用する必要があります –

答えて

1

このようにコードを変更してください。これは、ローカルタイムゾーンにUTCタイムゾーンを変換します:

public static Date getUTCToDate(String utc){ 
    // String exampleOfUTCTime = "2016-09-27T19:35:32.717"; 

    try{ 
     Log.d("asd-timeBefore", "getUTCToDate: " + utc); 
     DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS"); 
     formatter.setTimeZone(TimeZone.getTimeZone("UTC")); 
     Date d = formatter.parse(utc); 
     Log.d("asd-timeAfter", "getUTCToDate: " + d); 
     return d; 
    } catch (ParseException e){ 
     e.printStackTrace(); 
    } 
    return null; 
} 
+0

しかしどうですか?私は 'exampleOfUTCTime'のような文字列を受け取っているので、それをローカルタイムゾーンに変換する必要があると思っていましたが、Android/Javaはそれ自体ローカルのタイムゾーンを気にするようです。 –

+0

これが正しいかどうかわかりません。 –

+0

この変換はシステムによって自動的に行われます。 "OK"のようなUTCタイムゾーン→SimpleDateFormatを設定している場合は、これをDate - >に渡すと、自動的にローカルタイムゾーンに変換されます。思考日にタイムゾーンがありません - >内部関数にデフォルトのタイムゾーン(ローカルタイムゾーン)を使用する 'SimpleDateFormatter'があります – xAqweRx

1

あなたはUTC形式でフォーマットされた日付と時刻を取得したい場合、あなたはsetTimeZoneこの

formatter.setTimeZone(TimeZone.getTimeZone("UTC")); 
1

回答のように行う必要があります正しいです、しかし、代替手段として、あなたは文字列自体をUTCを指定しようとあなたがSimpleDateFormatクラスでタイムゾーンを使用していることを示すことができ、例えば:

public static Date getUTCToDate(String utc){ 
    // String exampleOfUTCTime = "2016-09-27T19:35:32.717 UTC"; 

    try{ 
     System.out.println("getUTCToDate: " + utc); 
     DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS z"); 
     Date d = formatter.parse(utc); 
     System.out.println("getUTCToDate: " + d); 
     return d; 
    } catch (ParseException e){ 
     e.printStackTrace(); 
    } 
    return null; 
} 
1

アプリはさまざまな国で使用されるため、ローカルタイムゾーンを使用する必要があります。

あなたは、クライアントのタイムゾーンを使用して、サーバー側で日付をフォーマットしたい場合は、クライアント側から数分にGMT時間からのオフセットを渡す必要があります。このJavaScriptコードを使用します。

var offset = new Date().getTimezoneOffset(); 

、これは、パラメータとして、あなたの方法にオフセットを渡します

public static Date getUTCToDate(String utc, int offsetInMinutes) { 
    // String exampleOfUTCTime = "2016-09-27T19:35:32.717"; 

    try { 
     Log.d("asd-timeBefore", "getUTCToDate: " + utc); 
     DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS Z"); 
     long offset = -1L*60*1000*offsetInMinutes; 
     String[] timezones = TimeZone.getAvailableIDs(offset); 
     formatter.setTimeZone(timezones[0]); 
     Date d = formatter.parse(utc); 
     Log.d("asd-timeAfter", "getUTCToDate: " + d); 
     return d; 
    } catch (ParseException e){ 
     e.printStackTrace(); 
    } 
    return null; 
} 

コメント:

をあなたは私が日付形式としてZが含まれていることに気づくでしょうパラメータ:SimpleDateFormatこれにより、GMT時間からのオフセットで表示される時間帯が表示されます。

Java Dateはオフセットに関係なく単純な時点です。クライアントからのタイムゾーン情報が必要な場合は、それを自分で持ち込む必要があります。

1

TL; DRは

LocalDateTime.parse("2016-09-27T19:35:32.717").atZone(ZoneOffset.UTC) 

詳細

あなたの入力文字列がないUTC値です:2016-09-27T19:35:32.717。そのStringにはoffset-from-UTCまたはtime zoneに関する情報がありません。

現在は古くなっている厄介な古い日時クラスを、java.timeクラスに置き換えて使用しています。

LocalDateTime

、オフセットまたはタイムゾーンを欠いLocalDateTime対象として、その文字列を解析します。

この入力文字列は、日付時刻文字列のISO 8601標準に準拠しています。 java.timeクラスは、文字列の解析/生成時にデフォルトでISO 8601形式を使用します。したがって、書式設定パターンを指定する必要はありません。

LocalDateTime ldt = LocalDateTime.parse("2016-09-27T19:35:32.717"); 

OffsetDateTime

あなたは文字列は、UTCのモーメントを表し、その後OffsetDateTimeを取得するためにオフセットを適用することを意図したことが確実にわかっているコンテキストによって場合。定義済み定数ZoneOffset.UTCを使用してください。

OffsetDateTime odt = ldt.atZone(ZoneOffset.UTC); 

そこから必要に応じて、さまざまな形式で文字列を生成するためにDateTimeFormatterを使用することができます。

ZonedDateTime

あなたには、いくつかの特定の地域のタイムゾーンのレンズを通してその同じ瞬間を表示したい場合は、ZonedDateTimeを取得するためにZoneIdを適用します。

タイムゾーンは、夏時間(DST)などの異常を処理するための規則のセットである、UTCからのオフセット()です。

proper time zone namecontinent/regionの形式で指定します。 ESTまたはISTのような3〜4文字の略語は、標準化されておらず、一意ではなく(!)、実際のタイムゾーンではないので使用しないでください。

ZoneId z = ZoneId.of("America/Montreal"); 
ZonedDateTime zdt = odt.atZoneSameInstant(z); 

必要に応じて、ユーザーの現在の既定のタイムゾーンを取得できます。しかし、このデフォルトはいつでも変更できることに注意してください。実行時にはでもです。重要な場合は、想定するのではなく意図した/希望する時間帯をユーザーに尋ねる必要があります。 java.timeについて

ZoneId z = ZoneId.systemDefault(); 

java.timeフレームワークは、Java 8に組み込まれており、後にされています。これらのクラスは、java.util.Date,.Calendar,& java.text.SimpleDateFormatなどの面倒な古いlegacy日時クラスに取って代わります。

にあるJoda-Timeプロジェクトは、java.timeへの移行を推奨しています。

詳しくはOracle Tutorialをご覧ください。そして、多くの例と説明のためにStack Overflowを検索してください。仕様はJSR 310です。

ここで、java.timeクラスを取得するには?

  • Java SE 8SE 9以降
    • 内蔵しています。
    • バンドルされた実装の標準Java APIの一部です。
    • Java 9には、いくつかのマイナーな機能と修正が加えられています。
  • Java SE 6とJavaの多く
  • Android
    • ThreeTenABPプロジェクトはThreeTen-バックポート具体的にAndroidのため(上記)を適応させます。
    • How to use…を参照してください。

ThreeTen-Extraプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、将来のjava.timeへの追加の可能性を証明する土台です。ここでは、IntervalYearWeekYearQuartermoreなどの便利なクラスがあります。

+0

これは十分以上のものです。これらを確認してください - 興味深い見えます! –

関連する問題