1

上記のコードでは、サーバーのタイムゾーン(GMT-02:00)による日付をデバイス(GMT-03:00)からタイムゾーンに変換したいと思います。しかし、私は常にサーバーの同じ日付を持っています。私は何を間違っていますか?

TimeZone timeZoneServer = TimeZone.getTimeZone(timeZoneServerString); 長い時間=newLong(Long.valueOf(timeInMilis));

        Calendar calendarDateServer =   Calendar.getInstance(timeZoneServer);
        calendarDateServer.setTimeInMillis(time);
        long miliServer = calendarDateServer.getTimeInMillis();

        TimeZone timeZoneMeu = TimeZone.getDefault();
        Calendar meuCalendario =  new GregorianCalendar();
        meuCalendario.setTimeZone(timeZoneMeu);

        meuCalendario.setTimeInMillis(miliServer);  
        Date transformedDate = meuCalendario.getTime();


        return transformedDate; 
4

2 に答える 2

3

私は何を間違っていますか?

あなたは、aDateが最初にタイムゾーンを持っていると仮定しています。そうではありません。AはそうですCalendarが、Unixエポックからわずか数ミリ秒です。カレンダーシステムやタイムゾーンについては知りません。それはただの時点です。Date

結果をどのように処理するかは明確ではありませんが、表示用にフォーマットする場合は、代わりにタイムゾーンを使用SimpleDateFormat設定してください。

また、組み込みの型の代わりにJodaTimeを使用することを強くお勧めします...これははるかに賢明なAPIです。

于 2013-02-01T22:45:57.767 に答える
0

java.time

Java 8以降には、java.timeフレームワークが組み込まれています。Joda-Timeに触発され、JSR 310によって定義され、ThreeTen-Extraプロジェクトによって拡張されました。これらの新しいjava.timeクラスは、Javaの初期バージョンにバンドルされている悪名高い厄介な古い日時クラスに取って代わりjava.util.Dateます.Calendar

java.timeの基本…AnInstantUTCのタイムライン上の瞬間です。タイムゾーン(ZoneId)を適用して。を取得しZonedDateTimeます。

サンプルコードでは、UTCからのオフセットのみを使用しています。タイムゾーンは、オフセットに加えて、夏時間(DST)などの異常の調整に関する一連のルールです。したがって、可能な限り適切なタイムゾーン名を使用してください。ただし、不可能な場合は、を使用ZoneOffsetしてを取得しOffsetDateTimeます。

ちなみに、一般的なベストプラクティスは、サーバーをUTCに保つことです。しかし、それは別の議論です。

まず、サーバーから現在の日時を取得します。

Instant now = Instant.now();  // UTC.
ZoneOffset offsetServer = ZoneOffset.of ( "-02:00" ); // Or ZoneOffset.systemDefault ()
OffsetDateTime odtServer = OffsetDateTime.ofInstant( instant , offsetServer );

または、次のように短縮できます。

ZoneOffset offsetServer = ZoneOffset.of ( "-02:00" ); // Or ZoneOffset.systemDefault ()
OffsetDateTime odtServer = OffsetDateTime.now ( offsetServer );

必要なオフセットを定義します。そのオフセットをサーバーの現在の日時に適用して調整します。

ZoneOffset offsetDesired = ZoneOffset.of ( "-03:00" );
OffsetDateTime odtDesired = odtServer.withOffsetSameInstant ( offsetDesired );

コンソールにダンプします。

System.out.println ( "instant: " + instant + " | odtServer: " + odtServer + " | odtDesired: " + odtDesired );

インスタント:2016-01-22T22:16:14.386Z | odtServer:2016-01-22T20:16:14.386-02:00 | odtDesired:2016-01-22T19:16:14.386-03:00

日時値のこれらのテキスト表現は、ISO8601標準toStringを使用する方法でデフォルトでフォーマットされます。必要に応じて他の形式を定義できます。多くの例については、StackOverflowを検索してください。

于 2016-01-22T22:11:35.653 に答える