2017-09-20 11 views
0

ここでは小さな問題です。私はうまく動作するアンドロイドのカウントダウンタイマーがありますが、問題はカウントダウンタイマーがユーザー/タイムゾーンの間で異なることです。これはつまり、タイムゾーンごとに、自分のタイムゾーンを基準にして、以前または後で終了する可能性のある別のカウントダウンが表示されることです。これは欲しくないので、すべてのカウントダウンがこの映画で同時に終了するようにしてくださいリリース。GMT/UTCに基づくAndroidのカウントダウンで、ユーザーのタイムゾーンではありません

マイコード: 注:いくつかのコードを簡潔にするため省略してのため、私は、GMT/UTCのタイマをカウントダウンすることができますどのようにコード

 // the current date and time 
     Calendar today = Calendar.getInstance(); 


    // release.date is in milliseconds at 12am and in GMT, example: GMT: Friday, September 29, 2017 12:00:00 AM 
    long currentTimeMillis = today.getTimeInMillis(); 
    long expiryTime = releaseDate.date - currentTimeMillis; 


    holder.mTextCountdown.setText(""); 
    if (holder.timer != null) { 
     // Cancel if not null to stop flickering 
     holder.timer.cancel(); 
    } 
    holder.timer = new CountDownTimer(expiryTime, 500) { 
     public void onTick(long millisUntilFinished) { 
      long seconds = millisUntilFinished/1000; // reminder: 1 sec = 1000 millis 
      long minutes = seconds/60; 
      long hours = minutes/60; 
      long days = hours/24; 

      String dayFormat = "days"; 
      String hoursFormat = "hours"; 
      if (days == 1) { 
       dayFormat = "day"; 
      } 
      if (hours == 1) { 
       hoursFormat = "hour"; 
      } 
      String time = days + " " + dayFormat + " : " + hours % 24 + " " + hoursFormat +" : " + minutes % 60 + " : " + seconds % 60; 
      holder.mTextCountdown.setText(time); 
     } 

     // Finished: counted down to 0 
     public void onFinish() { 
      holder.mTextCountdown.setText("Now out!"); 
     } 
    }.start(); 

のいくつかの説明のために以下のコメントをチェックしてくださいれますすべてのユーザーが同時に終了することを確認しますか?

はありがとう

答えて

1
私は2つの物事次の操作を行うためにあなたをお勧めします

:(UTCで

  1. ストアにすべての時間を、そして唯一のUI出力
  2. 同期時間をローカルタイムゾーンに変換し、サーバー側から設定してください)。とにかく、クライアントデバイスの現在の時刻を制御することはできません。タイムゾーンが間違っているか、何らかの理由でタイムサーバーがオフになっている可能性があります。ユーザーのデバイスでサーバー時間を同期させ、デルタがあればそれを保存し、サーバー時間に基づいてカウントダウンを表示するだけです。
+0

すべての回では、GMTですでに混乱して申し訳ありませんし、それが適切なリリース日を印刷しないので、実際にUIの出力のために私は、代わりに、ユーザーのタイムゾーンをGMTに変換します。 –

1

厄介な古いCalendar/Dateクラスではなく、最新のjava.timeクラスを使用してください。 Androidについては、以下の最後の箇条書きを参照してください。

9月23日にロサンゼルスで午後5時に映画をリリースしてください。

LocalDate ld = LocalDate.of(2017 , 9 , 23) ; 
LocalTime lt = LocalTime.of(17 , 0) ; 

ZoneId z = ZoneId.of("America/Los_Angeles") ; 
ZonedDateTime zdt = ZonedDateTime.of(ld , lt , z) ; 

これをUTCに変換すると、Instantオブジェクトになります。

Instant instant = zdt.toInstant() ; // Convert from a time zone to UTC. Same point on the timeline. 

これまでに計算した時間は、Durationです。

Duration d = Duration.between(Instant.now() , instant) ; 

ミリ秒単位で抽出します。

long millis = d.toMillis() ; 

おそらく、あなたはQuébecのユーザーに映画のリリース日時を見せたいと思うかもしれません。

ZonedId zUser = ZoneId.of("America/Quebec") ; 
ZonedDateTime zdtUser = instant.atZone(zUser) ; // Adjust into user’s time zone. Some point on the timeline. 
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL).withLocale(Locale.CANADA_FRENCH) ; 
String output = zdtUser.format(f) ; 

java.timeについて

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

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

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

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

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

ありがとう –

関連する問題