实际上我想禁用按钮30分钟。
下面的代码效果很好,但是如果我们终止应用程序并在30分钟内打开它,则现在启用该按钮。
public static void timmer(final ImageButton btn){
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
isTimerRunning = false;
btn.setEnabled(true);
}
}, 1800000);
}
现在我按下按钮点击系统时间,然后添加30分钟并将其保存到DataManager
(用户对象的单个类)。再次点击按钮我将保存时间与当前系统时间进行比较。
@OnClick(R.id.generalReportBtn)
public void setGeneralReport(ImageButton button) {
Log.e("Data Manager Time: ",DataManager.getInstance().getCurrentUser().getLastTime().MINUTE+"");
Log.e("Current Time: ", java.util.Calendar.getInstance().MINUTE+"");
if(DataManager.getInstance().getCurrentUser().getLastTime().after(java.util.Calendar.getInstance())){
DataManager.getInstance().getCurrentUser().lastTime.set(java.util.Calendar.getInstance().YEAR,java.util.Calendar.getInstance().MONTH,java.util.Calendar.getInstance().DATE,java.util.Calendar.getInstance().HOUR_OF_DAY,java.util.Calendar.getInstance().MINUTE,java.util.Calendar.getInstance().SECOND);
DataManager.getInstance().getCurrentUser().lastTime.add(DataManager.getInstance().getCurrentUser().lastTime.MINUTE,30);
}else if(Utilities.isFirstTimePressed){
Utilities.isFirstTimePressed = false;
DataManager.getInstance().getCurrentUser().lastTime.set(java.util.Calendar.getInstance().YEAR,java.util.Calendar.getInstance().MONTH,java.util.Calendar.getInstance().DATE,java.util.Calendar.getInstance().HOUR_OF_DAY,java.util.Calendar.getInstance().MINUTE,java.util.Calendar.getInstance().SECOND);
DataManager.getInstance().getCurrentUser().lastTime.add(DataManager.getInstance().getCurrentUser().lastTime.MINUTE,30);
}else {
Toast.makeText(mainclass,"Button is disabled for 30 minutes",Toast.LENGTH_SHORT).show();
}
}
但是这段代码对我来说也不起作用。
答案 0 :(得分:2)
首先设置变量。然后您的代码将更容易阅读:
java.util.Calendar cal = java.util.Calendar.getInstance();
User user = DataManager.getInstance().getCurrentUser();
然后使用这些变量而不是多次调用Calendar.getInstance()。
你正在混合常量和值。 YEAR是您想要年份值时使用的常量。
而不是这个(它总是会返回相同的值,因为它是一个常量):
java.util.Calendar.getInstance().YEAR
使用此:
cal.get(Calendar.YEAR)
为你的所有年份,月份等做这件事,一切都会奏效。
答案 1 :(得分:1)
Calendar.getInstance().YEAR
是constant that represents the year field(其值等于1
)。实际上,它与直接调用Calendar.YEAR
相同。
但这是不 Calendar
对象的年份值。当您执行set(java.util.Calendar.getInstance().YEAR
时,您将年份设置为1
(这可能不是您想要的)。这同样适用于MONTH
,MINUTE
以及您正在使用的所有其他常量。
另一个细节是您不需要一直创建另一个日历(通过调用Calendar.getInstance()
)。这是多余的,在您的代码中没有必要。
无论如何,首先要做的事情。在前两行中,您将打印MINUTE
常量,而不是日期的分钟值。如果要打印完整日期(这比仅仅分钟,IMO更有用),只需调用getTime()
方法即可。此外,在使用它们之前将值设置为变量,它使代码更清晰:
import java.util.Calendar;
Calendar lastTime = DataManager.getInstance().getCurrentUser().getLastTime();
Calendar now = Calendar.getInstance(); // current date/time
Log.e("Data Manager Time: ", lastTime.getTime() + "");
Log.e("Current Time: ", now.getTime() + "");
提醒您print the dates in the device's JVM default timezone。如果您想更改格式,请check in this link。
如果您仍想打印分钟,请将通话更改为getTime()
至get(Calendar.MINUTE)
。
现在剩下的逻辑(如果我理解正确的话)将是这样的:
if (lastTime.after(now)) {
lastTime = (Calendar) now.clone(); // lastTime becomes a copy of "now"
lastTime.add(Calendar.MINUTE, 30); // add 30 minutes
} else if (Utilities.isFirstTimePressed) {
Utilities.isFirstTimePressed = false;
lastTime.add(Calendar.MINUTE, 30); // add 30 minutes
} else {
Toast.makeText(mainclass, "Button is disabled for 30 minutes", Toast.LENGTH_SHORT).show();
}
旧类(Date
,Calendar
和SimpleDateFormat
)有lots of problems和design issues,它们将被新API取代。< / p>
在Android中,您可以使用ThreeTen Backport,这是Java 8新日期/时间类的绝佳后端。为了使其有效,您还需要ThreeTenABP(更多关于如何使用它here)。
检查是否过了30分钟的一种方法是使用org.threeten.bp.Instant
课程。然后使用isAfter
方法进行比较,使用org.threeten.bp.temporal.ChronoUnit
添加30分钟。
我还使用org.threeten.bp.ZoneId
将日期转换为JVM默认时区(只是打印它)。 In this link还有使用DateTimeFormatter
覆盖新API的答案,因此如果您想更改格式,可以参考它们。
我还使用org.threeten.bp.DateTimeUtils
类来转换为java.util.Calendar
。代码将是这样的:
// convert java.util.Calendar to org.threeten.bp.Instant
Instant lastTime = DateTimeUtils.toInstant(DataManager.getInstance().getCurrentUser().getLastTime());
Instant now = Instant.now();
Log.e("Data Manager Time: ", lastTime.atZone(ZoneId.systemDefault()) + "");
Log.e("Current Time: ", now.atZone(ZoneId.systemDefault()) + "");
if (lastTime.isAfter(now)) {
// add 30 minutes to current date/time
lastTime = now.plus(30, ChronoUnit.MINUTES);
} else if (Utilities.isFirstTimePressed) {
Utilities.isFirstTimePressed = false;
lastTime = lastTime.plus(30, ChronoUnit.MINUTES);
} else {
Toast.makeText(mainclass, "Button is disabled for 30 minutes", Toast.LENGTH_SHORT).show();
}
// convert back to java.util.Calendar (set it anywhere you need)
DateTimeUtils.toGregorianCalendar(lastTime.atZone(ZoneId.systemDefault()));
我正在使用ZoneId.systemDefault()
,它采用JVM默认时区(与创建Calendar.getInstance()
时使用的相同,因此通常不会有太大问题,除非用户更改它。)
问题是即使在运行时也可以更改默认时区,因此理想情况是指定一个,如果可能的话。 API使用IANA timezones names(始终采用Region/City
格式,如America/Sao_Paulo
或Europe/Berlin
)。
避免使用3个字母的缩写(例如CST
或PST
),因为它们是ambiguous and not standard。
您可以致电ZoneId.getAvailableZoneIds()
获取可用时区列表(并选择最适合您系统的时区)。
答案 2 :(得分:0)
简单的方法是 获取Systems TimeStamp,如:
$filter('filter')(v, function(vc) {return vc.status ==1}).length
添加30分钟。
long systemTime = System.currentTimeMillis()
将其存储到共享首选项。 现在从共享首选项中获取值,并与当前时间进行比较。