【问题标题】:Get System Time and add 30 minutes to it, after that compare it with another system time获取系统时间并添加 30 分钟,然后将其与另一个系统时间进行比较
【发布时间】:2017-10-05 14:23:21
【问题描述】:

其实我想禁用一个按钮 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 android calendar datetime-comparison


    【解决方案1】:

    首先设置一个变量。那么你的代码会更容易阅读:

    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)
    

    在你所有的年、月等时间里都这样做,一切都会奏效。

    【讨论】:

      【解决方案2】:

      Calendar.getInstance().YEAR 是一个constant that represents the year field(其值等于1)。其实和直接调用Calendar.YEAR是一样的。

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

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

      无论如何,第一件事。在前 2 行中,您打印的是 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();
      }
      

      Java 新的日期/时间 API

      旧的类(DateCalendarSimpleDateFormat)有 lots of problemsdesign issues,它们正在被新的 API 取代。

      在 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 也有涵盖新 API 的答案,使用 DateTimeFormatter,因此如果您想更改格式,可以参考它们。

      我还使用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_PauloEurope/Berlin)。 避免使用三个字母的缩写(如CSTPST),因为它们是ambiguous and not standard

      您可以致电ZoneId.getAvailableZoneIds() 获取可用时区列表(并选择最适合您系统的时区)。

      【讨论】:

        【解决方案3】:

        简单的方法是 获取系统时间戳,如:

        long systemTime = System.currentTimeMillis()
        

        增加 30 分钟。

        systemTime += 180000 //(180000 miliseconds is equivalent to 30 minutes)
        

        将其存储到共享首选项。 现在从共享偏好中获取值并与当前时间进行比较。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-10
          • 1970-01-01
          相关资源
          最近更新 更多