大家好, 我正在开发一个带闹钟的应用程序。当用户设置闹钟时,应用应该告诉用户闹钟响起的时间。
我正在使用simpleDateFormater将毫秒转换为正确的格式。警报在设定的时间正确关闭,但在格式化的时间内,我总是额外增加11个小时。
例如。如果时间现在是凌晨1点,我将闹钟设置为凌晨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.我该如何摆脱它?
感谢您花时间阅读本文以及您可以提供的任何帮助。
答案 0 :(得分:4)
我怀疑问题是您使用本地时区进行格式化。您基本上是在1970年1月1日UTC创建日期,然后使用默认时区格式化时间。
就我个人而言,我根本不会使用SimpleDateFormat
- 我可能会使用Joda Time,并将其格式化为Duration
或Period
,因为这就是你真的想代表。
如果您 想要使用SimpleDateFormat
,您可能希望使用H
(24小时格式)而不是h
,并设置时间区域到UTC。
答案 1 :(得分:1)
为了放大Jon Skeet的答案,set_time - current
并不是真正的约会,至少在语义上是这样。所以,即使你可以让SimpleDateFormat
工作,也会产生误导。
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();