如何在Android中比较AM / PM时间

时间:2014-09-17 12:02:48

标签: java android time calendar

我有一个场景

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

如果我的current-time(比如9:15 PM采用与开始或结束时间相同的格式)落在start-timeend-time之间,那么转到screen 1其他明智的转到screen 2

我的问题是如何将current-time大于或等于'开始时间'与更少或等于'结束时间'进行比较。我尝试过将给定时间值转换为milliseconds并进行比较,但current-time = 9:15 PM似乎大于'结束时间=凌晨2:00',因为凌晨2:00将在中期之后到来晚上意味着如果'下午9:15那天=星期四,那么凌晨2:00将是星期五'。我经常搜索,但无法弄清楚。任何类型的帮助将不胜感激。

编辑:

当前时间,开始时间和结束时间所有值均为String

编辑2

code 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;
}

5 个答案:

答案 0 :(得分:7)

第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
    }

答案 1 :(得分:4)

试试这个:

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
}

答案 2 :(得分:1)

使用支持仅包含日期或时区的仅限时间值的日期时间库。

在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.
}

答案 3 :(得分:0)

从我的头顶,你可以做到这一点。你是 lazy (一些小代码会这样做),所以我

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

  2.   
  3. 如果1为真,那么如果结束时间是pm,则返回true。否则,检查当前时间&lt;结束时间并返回true / false。

  4.   

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

答案 4 :(得分:0)

以下是获取当前日期int timestamp(long millisec)

的示例代码
   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进行比较..如果您需要,我可以解释更多。