【问题标题】:How to compare AM/PM time in Android如何在 Android 中比较 AM/PM 时间
【发布时间】:2014-09-17 12:02:47
【问题描述】:

我有一个场景

start-time = 4:15 PM
end-time = 2:00 AM 

如果我的current-time(假设是晚上 9:15,格式与开始或结束时间相同)介于 start-timeend-time 之间,则转到 screen 1 其他明智的转到 screen 2

我的问题是如何比较 current-time 大于或等于“开始时间”和小于或等于“结束时间”。我尝试将给定的时间值转换为milliseconds 并进行比较,但current-time = 9:15 PM 似乎大于“结束时间 = 凌晨 2:00”,因为凌晨 2:00 将在午夜之后到来意味着如果` 9:15 PM 天 = 星期四,然后 2:00 AM 将是星期五'。我搜索了很多,但无法弄清楚。我们将不胜感激任何类型的帮助。

已编辑:

当前时间、开始时间和结束时间所有值都取为String

编辑 2

代码spinet:

long currentTime = getMillis("9:15 PM");

long startTime = getMillis("4:15 PM");

long endTime = getMillis("2:00 AM");//this will be the next day's time confusing part for me

if(currentTime >= startTime && currentTime <= endTime)
{
   //goto screen 1
}
else
{
  // goto screen 2
}


private long getMillis(String givenTime)
{
   SimpleDateFormat sdf = new SimpleDateFormat("h:mm a");
try {
    Date mDate = sdf.parse(givenTime);
    long timeInMilliseconds = mDate.getTime();
    System.out.println("Date in milli :: " + timeInMilliseconds);
    return timeInMilliseconds;
} catch (ParseException e) {
            e.printStackTrace();
}
return 0;
}

【问题讨论】:

  • 你的时间怎么样?作为时间实例?或者作为 Date 实例的一部分,或者作为 Calendar 实例的一部分,或者只是作为一个字符串?
  • @TheLostMind 查看我的编辑
  • 你如何比较这些对象。可以发一些代码吗?
  • 你能用 24hr fromat 作为时间吗?
  • @blackbelt 我用代码编辑了我的问题

标签: java android time calendar


【解决方案1】:

第 1 步: 您只需在结束时间低于开始时间时添加一天

第 2 步: 应用您的条件检查当前时间是否介于开始时间和结束时间之间

    try {
        Date mToday = new Date();

        SimpleDateFormat sdf = new SimpleDateFormat("hh:mm aa");
        String curTime = sdf.format(mToday);
        Date start = sdf.parse("4:15 PM");
        Date end = sdf.parse("2:00 AM");
        Date userDate = sdf.parse(curTime);

        if(end.before(start))
        {
            Calendar mCal = Calendar.getInstance();
            mCal.setTime(end);
            mCal.add(Calendar.DAY_OF_YEAR, 1);
            end.setTime(mCal.getTimeInMillis());
        }

        Log.d("curTime", userDate.toString());
        Log.d("start", start.toString());
        Log.d("end", end.toString());


        if (userDate.after(start) && userDate.before(end)) {
            Log.d("result", "falls between start and end , go to screen 1 ");
        }
        else{
            Log.d("result", "does not fall between start and end , go to screen 2 ");
        }
    } catch (ParseException e) {
        // Invalid date was entered
    }

【讨论】:

  • @SagarPilkhwal 谢谢,很高兴为您提供帮助。
  • @MehulJoisar 很好的回答继续 +1
  • 为我工作...很好的答案 +1
【解决方案2】:

试试这个:

Date dt = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("hh:mm aa");
String curTime = sdf.format(dt);
Date start = parser.parse("4:15 PM");
Date end = parser.parse("2:00 AM");

try {
    Date userDate = parser.parse(curTime);
    if (userDate.after(start)){
      ....
      //you can have your if...else if... conditions 
    }
    if(userDate.before(end)) {
        ....
    }
} catch (ParseException e) {
    // Invalid date was entered
}

【讨论】:

  • 你的方法是对的。但在他的情况下这仍然会失败。您的代码假设同一天,OP 想要凌晨 2 点 > 下午 5 点(即隐式假设第二天凌晨 2 点)。
  • 是的,对.. 我的想法是,在时间比较的情况下,我们不能与第二天比较,如果我们想考虑第二天凌晨 2 点,我们可能还需要日期
  • @TheLostMind:没错,我让这种隐含的思维像外显一样发挥作用
  • @SagarPilkhwal:是的,我们需要比较日期,我使用日历作为当前实例并根据条件进行了调整。
  • @SagarPilkhwal :我还没有发布问题。我已经发布了答案。是的,我已经为您的答案 +1,因为我已经使用并增强了它。
【解决方案3】:

使用支持没有日期或时区的纯时间值的日期时间库。

在 Java 世界中,我们有两个很好的日期时间库:Joda-Time 和 java.time(与 Java 8 捆绑在一起,受 Joda-Time 启发,由 JSR 310 定义)。这两个库都提供了一个LocalTime 类。

乔达时间

以下是 Joda-Time 2.4 中的一些未经测试代码,可帮助您找到正确的方向。

String inputStart = "4:15 PM";
String inputStop = "2:00 AM";

DateTimeFormatter formatter = DateTimeFormat.forPattern( "h:mm a" );
LocalTime start = formatter.parseLocalTime( inputStart );
LocalTime stop = formatter.parseLocalTime( inputStop );
String now = LocalTime.now( DateTimeZone.forID( "America/Montreal" ) );

boolean isNowInRange = false;
if( start.isEqual( stop ) ) {
    isNowInRange = ( now.isEqual( start ) );
} else if ( start.isBefore( stop ) ) {
    isNowInRange = ( ( now.isEqual( start ) || now.isAfter( start ) ) && now.isBefore( stop ) );
} else if ( start.isAfter( stop ) ) {
    isNowInRange = ( ( now.isEqual( start ) || now.isAfter( start ) ) || now.isBefore( stop ) );
} else {
    // FIXME: Handle this supposedly impossible case.
}

【讨论】:

    【解决方案4】:

    从我的脑海中,你可以做到这一点。你是懒惰(一些小代码会这样做),我也是

    1. 如果开始时间包含“AM”并且当前时间包含“AM”,则只需检查两者的值即可知道哪个更大。

    2. 如果 1 为真,则结束时间为下午,则返回真。否则,检查当前时间是否

    PS:如果您在 case-1 中有 PM,请遵循相同的方法。此外,这肯定,不是实现你想要的好方法。

    【讨论】:

      【解决方案5】:

      这是获取当前日期 int 时间戳(长毫秒)的示例代码

         Long dateTs;
          Date dateToday = new Date();
          String s = dateToday.toString();
          s = s.substring(4, 10) + ", " + s.substring(30, 34);
          try {
              Date date = new SimpleDateFormat("MMMM d, yyyy", Locale.ENGLISH)
                      .parse(s);
              dateTs = date.getTime();   // today 00:00 hours
          } catch (ParseException e1) {
              // TODO Auto-generated catch block
              e1.printStackTrace();
          }
      
      Similarly, you can get timestamp for any datetime you want
      

      然后简单地将时间戳与当前日期的 if else 进行比较。如果您觉得需要,我可以解释更多。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-19
        • 2015-07-28
        • 1970-01-01
        • 2018-01-21
        • 2023-03-16
        相关资源
        最近更新 更多