2016-06-16 11 views
0

時刻の書式設定と調整は、プログラミングにおいて常に私の最大の敵であり、わかっていないAndroid/Javaの問題があります。私は、UTCでフォーマットされたサーバーからタイムスタンプを取得します(2016-06-17T18:30:00-07:00の例です)。今度は、この時間はユーザーのローカル時刻にフォーマットする必要があります。 PSTは11:30 AMと表示されるはずですが)これまでに何を試しても午前1時または午後6時30分(私は間違ったことをしていることを知っていますので、何が分からないのか分かりません)。したがって、この時点で私は1:30を取得していますISOストリングからのJoda DateTimeの書式設定に関する問題

public static DateTime convertISOStringToDate(String inputString) { 
//setup the ISO Date Formatter with GMT/UTC format 
    DateTimeFormatter formatter = ISODateTimeFormat.dateTimeParser() 
      .withLocale(Locale.US) 
      .withZone(DateTimeZone.forOffsetHours(0)); 
    DateTime dateTime = formatter.parseDateTime(inputString); 
    //now convert the datetime object to a local date time object 
    DateTimeFormatter localFormatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss") 
      .withZone(DateTimeZone.getDefault()); 
    String localString = localFormatter.print(dateTime); 
    DateTime localDateTime = localFormatter.parseDateTime(localString); 
    return localDateTime; 

を行うので、私は、私は、変換プロセスのどこかでそれをめちゃくちゃにしています知っているが、私はそれを把握することはできません。私はGoogleにしようとしてきました私はそれらを試しても動作しないようにISODateTimeFormatパーサを使用することはあまり見つかっていません。

答えて

0

あなたは、日付がどのように表現されているかを基本的に誤解しているようです。 日付(ほぼすべての既知のプログラミング言語/ライブラリ)は、「エポック」と呼ばれる特定の「起点時刻」からのオフセットとして内部的に表されます。

java.util.Dateおよびjoda日付では、内部表現は、1980年1月1日の深夜0時からのミリ秒数です。

このように、日付にはタイムゾーンがありません。日付の書式設定時には、タイムゾーンを導入するだけです(日付の文字列表現に変換します)。

文字列を解析して日付オブジェクトにして、指定した元の文字列とは異なるタイムゾーンでシリアル化(印刷)した後、再度解析して何かがあることを期待していますかわった。それを正しく行うと、あなたが始まった日付とまったく同じ日付に戻ります。

あなたの場合、取得した「localString」は、ローカルタイムゾーンで正しい時刻を示します。私はEDTにいます。これはUTC-4:00です。結果として2016-06-17 21:30:00を正しく取得します。

私はので、それは無用である見て、その裏のDateTimeに解析し、そして、言ったように:あなたは

  • で開始することをあなたが同じ日時が返されます

    • あなたIDE(またはあなたがDateTimeを調べるために使用しているもの)は、おそらくあなたが期待しているものを表示していません。

    あなたは本当に日時を「変換」する、または単にそれを解析するために、そして実際に日付の書式は、タイムゾーンに関してどのように機能するかを理解する必要があるかどうか、あなたがここで何をやっている再評価し、必要があります。