Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获取系统时间并添加30分钟,然后将其与另一个系统时间进行比较_Java_Android_Calendar_Datetime Comparison - Fatal编程技术网

Java 获取系统时间并添加30分钟,然后将其与另一个系统时间进行比较

Java 获取系统时间并添加30分钟,然后将其与另一个系统时间进行比较,java,android,calendar,datetime-comparison,Java,Android,Calendar,Datetime Comparison,实际上我想禁用一个按钮30分钟 下面的代码运行得很好,但是如果我们在30分钟内关闭应用程序并打开它,按钮现在就被启用了 public static void timmer(final ImageButton btn){ new Handler().postDelayed(new Runnable() { @Override public void run() { isTimerRunning = false;

实际上我想禁用一个按钮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();
    }
}

但是这段代码对我也不起作用。

首先设置一个变量。这样,您的代码将更易于阅读:

java.util.Calendar cal = java.util.Calendar.getInstance();
User user = DataManager.getInstance().getCurrentUser();
然后使用这些变量,而不是多次调用Calendar.getInstance()

你把常数和值搞混了。“年”是一个常量,当您要计算“年”值时,可以使用该常量

而不是这个(因为它是常量,所以总是返回相同的值):

使用以下命令:

cal.get(Calendar.YEAR)
在你所有的年份、月份等中都这样做,一切都会正常工作。

Calendar.getInstance()。YEAR
是a(其值等于
1
)。实际上,这与直接调用
Calendar.YEAR
是一样的

但这不是
日历对象的年份值。当您执行
设置(java.util.Calendar.getInstance().YEAR
时,您将年份设置为
1
(这可能不是您想要的)。这同样适用于
分钟
以及您正在使用的所有其他常量

另一个细节是,您不需要一直(通过调用
calendar.getInstance()
)创建另一个日历。这是多余的,在代码中不是必需的

无论如何,首先要做的是。在前两行中,您打印的是
MINUTE
常量,而不是日期的minutes值。如果您想打印完整日期(这比分钟有用得多,依我看),只需调用
getTime()
method。另外,在使用变量之前,将其值设置为变量,这会使代码更加清晰:

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() + "");
只是提醒一下,这会。如果你想更改格式,只需

如果仍然只想打印分钟数,请将调用更改为
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();
}
// 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()));

Java新的日期/时间API 旧类(
Date
Calendar
SimpleDateFormat
)具有和,它们正在被新的API所取代

在Android中,您可以使用,这是Java8新的日期/时间类的一个很好的后端口

检查30分钟是否已经过去的一种方法是使用
org.threeten.bp.Instant
类。然后使用
isAfter
方法进行比较,并使用
org.threeten.bp.temporal.ChronoUnit
添加30分钟

我还使用
org.threeten.bp.ZoneId
将日期转换为JVM默认时区(仅用于打印)。还有一些答案使用
DateTimeFormatter
涵盖了新的API,因此如果您想更改格式,可以参考它们

我还使用
org.threeten.bp.DateTimeUtils
类从和转换为
java.util.Calendar
。代码如下:

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();
}
// 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使用的格式(总是
地区/城市
,如
美国/圣保罗
欧洲/柏林
)。 避免使用三个字母的缩写(如
CST
PST
),因为它们是

通过调用
ZoneId.getAvailableZoneIds()

可以获得可用时区的列表(并选择最适合您的系统的时区) 获取系统时间戳,如:

long systemTime = System.currentTimeMillis()
再加上30分钟

systemTime += 180000 //(180000 miliseconds is equivalent to 30 minutes)
将其存储到共享首选项。 现在从共享首选项中获取值,并与当前时间进行比较