【问题标题】:Make a button clickable only after a date仅在日期之后使按钮可点击
【发布时间】:2020-07-02 14:13:52
【问题描述】:

我想知道我应该在按钮的 OnClick 中添加什么以使其可点击,比如说在下午 1 点到 5 点之间,但其余时间它只会显示一个吐司说“下午 1 点可用只要。” ?

或者我应该使用什么方法来保存/查看时间?

这是我现在的按钮:

button.setOnClickListener(new OnClickListener(){
    @Override
    public void OnClick(View v){

    }
});

提前致谢

【问题讨论】:

  • 看看java.time包中的类。
  • 亲爱的投票者:请在投票的同时留下批评。我看不出这个明确的具体问题有什么问题。

标签: java android-studio datetime button onclick


【解决方案1】:

使用基本 java 库中可用的 Date 方法。 像这样的:

Date date = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm") ;
dateFormat.format(date);

if(dateFormat.parse(dateFormat.format(date)).after(dateFormat.parse("13:00")) && dateFormat.format(date)).before(dateFormat.parse("17:00")));
{
    System.out.println("Accepted");
}else{
    System.out.println("Only avaible at 1PM only");
}

把它放在你的 onClick 函数中。

如果这对你有帮助,请投票给我。我是新来的,想拥有一些基本的声誉。谢谢! ?

【讨论】:

  • 这是旧的 java date api。我建议您使用“新”(java 8) api 发布解决方案。
【解决方案2】:

我会这样做:

        button.setOnClickListener(new OnClickListener(){
            @Override
            public void OnClick(View v){
                LocalTime time = LocalTime.now();
                // simply check the hour of the day
                if (time.getHour() >= 13 && time.getHour() < 17) {
                   // Welcome for business.
                } else {
                    System.out.println("Available at 1PM only.");
                }
            }
        }

注意LocalTime 的使用,这是时间的首选方法。如果需要,还有LocalDateTime

您可能还需要考虑设置一个计时器,以便在适当的时间启用和禁用该按钮。您可以根据时间将按钮的标题设为“关闭”或“打开”。

【讨论】:

    【解决方案3】:

    tl;博士

    LocalTime lt = LocalTime.now( ZoneId.of( "America/Montreal" ) ) ;
    
    if
    ( 
        ( ! lt.isBefore( LocalTime.of( 13 , 0 ) )   // If 1 PM or later ( in other words, if not before 1 PM )
        &&                                          // …and…
        lt.isBefore( LocalTime.of( 17 , 0 )         // if not yet 5 PM
    ) 
    {
        … proceed 
    }
    else
    {
        … reject user
    }
    

    半开

    Answer by WJS 很接近,明智地利用了现代的 java.time 类。但是,在日期时间工作中,通常最好使用半开方法定义时间跨度。在这种方法中,开头是inclusive,而结尾是exclusive

    因此,下午 1 点到下午 5 点的范围从 13:00 开始,一直持续到但不包括 17:00。

    LocalTime start = LocalTime.of( 13 , 0 ) ;
    LocalTime stop = LocalTime.of( 17 , 0 ) ;
    

    捕捉当前时间。

    ZoneId z = ZoneId.systemDefault() ;  // Or specify a zone such as `Africa/Tunis` or `Asia/Tokyo`. 
    LocalTime now = LocalTime.now( z ) ;
    

    比较开始和停止范围。我们使用LocalTime 上的equalsisBeforeisAfter 方法进行比较。

    提示:询问“等于或晚于”的简短方法是“不早于”。

    boolean nowInEffect = ( ! now.isBefore( start ) ) && ( now.isBefore( stop ) ) ;
    

    然后执行您的用户界面操作。

    if ( nowInEffect ) {
        … proceed
    } else {
        … tell user to check back later
    }
    

    关于java.time

    java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

    要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

    Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

    您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。

    从哪里获得 java.time 类?

    【讨论】:

    • 请问您为什么要花时间为一个已经解决的基础知识的 -3 投票问题写这么大的答案。
    • @Nand 因为 (a) 我不关心这个问题的投票,一个好的答案的坏问题仍然可以帮助其他人。 (b) 我不记得有人问过任何类似的时间范围问题,所以这是值得的。我不确定这个问题是否真的值得 3 票反对。 (c) 我当然不会说日期时间处理是大多数程序员的“基本知识”。这个主题出奇地棘手和复杂。例如:我所讨论的确定时间的时区问题对很多人来说并不明显。
    猜你喜欢
    • 2018-04-23
    • 1970-01-01
    • 2012-02-22
    • 2020-08-19
    • 2018-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    相关资源
    最近更新 更多