0

大家好,我正在开发一个有闹钟的应用程序。当用户设置闹钟时,应用程序应该告诉用户闹钟响起还有多长时间。

我正在使用 simpleDateFormater 将毫秒转换为正确的格式。闹钟在设定的时间正确响起,但在格式化的时间里,我总是得到额外的 11 小时。

例如。如果现在时间是凌晨 1:00,我将闹钟设置为凌晨 1:10。我收到消息说闹钟设置为 11 小时 10 分钟而不是 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

4

我怀疑问题是您正在使用本地时区进行格式化。您基本上是在 1970 年 1 月 1 日 UTC 创建一个日期,然后使用您的默认时区格式化时间。

就我个人而言,我根本不会SimpleDateFormat在这里使用 - 我可能会使用Joda Time,并将其格式化为 aDuration或 a Period,因为这才是你真正想要表达的。

如果您确实想要使用SimpleDateFormat,您可能想要使用H(24 小时格式)而不是h,并将时区设置为 UTC。

于 2013-09-05T17:01:03.073 回答
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 回答