0

みなさん、こんにちは、私は目覚まし時計のあるアプリに取り組んでいます。ユーザーがアラームを設定すると、アプリはアラームが鳴るまでの時間をユーザーに通知する必要があります。

ミリ秒を正しい形式にするために simpleDateFormater を使用しています。アラームは設定された時刻に正しく鳴りますが、フォーマットされた時刻では常に 11 時間余分に取得されます。

例えば。現在の時刻が午前 1 時で、アラームを午前 1 時 10 分に設定している場合。アラームが 10 分ではなく 11 時間 10 分に設定されているというメッセージが表示されます。アラームは午前 1 時 10 分に正しく鳴ります。

関連するコードを添付しています。これ以上のコードが必要な場合はお知らせください。

long current = System.currentTimeMillis();
long time_left = set_time-current; // set_time is the time the alarm should go off , and it is set else where in the activity.
String datePattern = "h ' hours and' mm ' minutes'";
SimpleDateFormat formatter = new SimpleDateFormat(datePattern);
String timeLeft_string = formatter.format(time_left);
Toast.makeText(getBaseContext(), "Alarm set for"+timeLeft_string, Toast.LENGTH_SHORT).show();


Intent intent = new Intent(getBaseContext(), AlarmReceiver.class);

intent.putExtra("id", mRowId);
PendingIntent pendingIntent = PendingIntent.getBroadcast(getBaseContext(), mRowId_int, intent, 0);
AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, set_time, pendingIntent);

ここに私の質問があります: 1. 11 時間はどこから来たのですか? 2.どうすればそれを取り除くことができますか?

時間を割いてこれを読んでくれてありがとう。

4

2 に答える 2

1

Jon Skeetの答えを増幅するだけset_time - currentで、少なくとも意味的には、実際には日付ではありません. そのため、たとえSimpleDateFormat仕事に取り掛かることができたとしても、それは誤解を招くものです。

Joda Time は良い選択ですが、あなたが上で説明した以上の時間操作を実際に行うつもりがない場合は、少し分割して改造するだけです:

final long MILLIS_PER_SECOND = 1000;
final long SECONDS_PER_HOUR = 3600;
final long SECONDS_PER_MINUTE = 60;

long deltaSeconds = time_left / MILLIS_PER_SECOND;
long deltaHours = deltaSeconds / SECONDS_PER_HOUR;
long leftoverSeconds = deltaSeconds % SECONDS_PER_HOUR;
long deltaMinutes = leftoverSeconds / SECONDS_PER_MINUTE;

Toast.makeText(getBaseContext(), 
      String.format(Locale.US, "Alarm set for %d hours and %d minutes", deltaHours, deltaMinutes),
      Toast.LENGTH_SHORT).show();
于 2013-09-05T18:02:50.500 に答える