【问题标题】:Calculate difference between two times android计算两次android之间的差异
【发布时间】:2013-09-25 08:49:32
【问题描述】:

我正在开发和android应用程序,我需要计算两次之间的差异。我需要计算24小时的时差,以及两天时间之间的差异(例如今天下午5点到明天早上9点)。

我已经尝试了下面的代码来计算仅适用于 24 小时的差异,

String dateStart = "08:00:00";
String dateStop = "13:00:00";

//HH converts hour in 24 hours format (0-23), day calculation
SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");

Date d1 = null;
Date d2 = null;

try 
{
    d1 = format.parse(dateStart);
    d2 = format.parse(dateStop);

    //in milliseconds
    long diff = d2.getTime() - d1.getTime();
    long diffHours = diff / (60 * 60 * 1000) % 24;
    Log.e("test",diffHours + " hours, ");
}
catch (Exception e) 
{
    // TODO: handle exception
} 

【问题讨论】:

  • 检查this。希望对您有所帮助。

标签: java android date time simpledateformat


【解决方案1】:

找到合适时差的正确方法:

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss");
Date startDate = simpleDateFormat.parse("22:00:59");
Date endDate = simpleDateFormat.parse("23:00:10");

long difference = endDate.getTime() - startDate.getTime(); 
if(difference<0)
{
    Date dateMax = simpleDateFormat.parse("24:00:00");
    Date dateMin = simpleDateFormat.parse("00:00:00");
    difference=(dateMax.getTime() -startDate.getTime() )+(endDate.getTime()-dateMin.getTime());
}
int days = (int) (difference / (1000*60*60*24));  
int hours = (int) ((difference - (1000*60*60*24*days)) / (1000*60*60)); 
int min = (int) (difference - (1000*60*60*24*days) - (1000*60*60*hours)) / (1000*60);
int sec = (int) (difference - (1000*60*60*24*days) - (1000*60*60*hours) - (1000*60*min)) / (1000);
Log.i("log_tag","Hours: "+hours+", Mins: "+min+", Secs: "+sec); 

结果将是:小时:0,分钟:59,秒:11

【讨论】:

  • 太棒了!我真的很喜欢你处理更改日期的方式
  • 您好,如何获取与小时、分钟等相同格式的秒数?
  • @Naveen 抱歉有点晚了,我也更新了上面的计算秒数的答案,希望这对你和其他人也有帮助。
  • 太棒了,这应该是公认的答案
【解决方案2】:

tl;博士

ChronoUnit.HOURS.between( 
    LocalTime.parse( "08:00:00" ) , 
    LocalTime.parse( "13:00:00" ) 
)

5

……或者……

ChronoUnit.HOURS.between( 
    ZonedDateTime.of( 
        LocalDate.of( 2017 , Month.JANUARY , 23 ) ,
        LocalTime.parse( "08:00:00" ) , 
        ZoneId.of( "America/Montreal" )
    ) , 
    ZonedDateTime.of( 
        LocalDate.of( 2017 , Month.JANUARY , 25 ) ,
        LocalTime.parse( "13:00:00" ) , 
        ZoneId.of( "America/Montreal" )
    ) 
) 

53

java.time

现代方法使用 java.time 类。

LocalTime

LocalTime 类表示没有日期和时区的时间。

LocalTime start = LocalTime.parse( "08:00:00" ) ;
LocalTime stop = LocalTime.parse( "13:00:00" ) ;

Duration

获取一个Duration 对象来表示时间跨度。

Duration d = Duration.between( start , stop ) ;

ChronoUnit

对于小时数,使用ChronoUnit

long hours = ChronoUnit.HOURS.between( start , stop ) ;

安卓

对于 Android,请参阅 ThreeTen-Backport 和 ThreeTenABP 项目。请参阅下面的最后一个项目符号。

ZonedDateTime

如果您想跨天,超过午夜,您必须指定日期和时区。

时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因区域而异。例如,Paris France 中午夜后几分钟是新的一天,而 Montréal Québec 中仍然是“昨天”。

continent/region 的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用 3-4 个字母的缩写,例如 ESTIST,因为它们不是真正的时区,没有标准化,甚至不是唯一的 (!)。

ZoneId z = ZoneId.of( "America/Montreal" ) ;

ZonedDateTime start = ZonedDateTime.of( 
    LocalDate.of( 2017 , Month.JANUARY , 23 ) ,
    LocalTime.parse( "08:00:00" ) , 
    z
) ;

ZonedDateTime stop = ZonedDateTime.of( 
    LocalDate.of( 2017 , Month.JANUARY , 25 ) ,
    LocalTime.parse( "13:00:00" ) , 
    z
) ;

long hours = ChronoUnit.HOURS.between( start , stop ) ;

看到这个code run live at IdeOne.com

53


关于java.time

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

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

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

从哪里获得 java.time 类?

【讨论】:

    【解决方案3】:
    Try simple piece of code using For 24 hour time
    StartTime = "10:00";
    EndTime = "13:00";
    here starthour=10 and end hour=13 
    
    if(TextUtils.isEmpty(txtDate.getText().toString())||TextUtils.isEmpty(txtDate1.getText().toString())||TextUtils.isEmpty(txtTime.getText().toString())||TextUtils.isEmpty(txtTime1.getText().toString()))
        {
            Toast.makeText(getApplicationContext(), "Date/Time fields cannot be blank", Toast.LENGTH_SHORT).show();
        }
        else {
            if (starthour > endhour) {
                Toast.makeText(getApplicationContext(), "Start Time Should Be Less Than End Time", Toast.LENGTH_SHORT).show();
            } else if (starthour == endhour) {
                if (startmin > endmin) {
                    Toast.makeText(getApplicationContext(), "Start Time Should Be Less Than End Time", Toast.LENGTH_SHORT).show();
                }
                else{
                    tvalid = "True";
                }
            } else {
                // Toast.makeText(getApplicationContext(),"Sucess"+(endhour-starthour)+(endmin-startmin),Toast.LENGTH_SHORT).show();
                tvalid = "True";
            }
        }
    same for date also
    

    【讨论】:

      【解决方案4】:

      我是这样解决的:

      Date time1 = new SimpleDateFormat("HH:mm:ss aa").parse(string1);
      Calendar calendar1 = Calendar.getInstance();
      calendar1.setTime(time1);
      
      Date time2 = new SimpleDateFormat("HH:mm:ss aa").parse(string2);
      Calendar calendar2 = Calendar.getInstance();
      calendar2.setTime(time2);
      
      if(calendar2.get(Calendar.AM_PM) == 1 && calendar1.get(Calendar.AM_PM) == 0)     {
           calendar2.add(Calendar.DATE, 1);
      }
      long diff = calendar1.getTimeInMillis() - calendar2.getTimeInMillis()
      

      这将有助于找到全天候的时差。

      【讨论】:

      • 当我尝试使用 13:00 PM11:00 AM 时它不起作用
      【解决方案5】:

      如果您确定早上 9 点是第二天,您也可以尝试这样的方法,您可以添加一天并计算差异:

      String string1 = "05:00:00 PM";
          Date time1 = new SimpleDateFormat("HH:mm:ss aa").parse(string1);
          Calendar calendar1 = Calendar.getInstance();
          calendar1.setTime(time1);
      
          String string2 = "09:00:00 AM";
          Date time2 = new SimpleDateFormat("HH:mm:ss aa").parse(string2);
          Calendar calendar2 = Calendar.getInstance();
          calendar2.setTime(time2);
          calendar2.add(Calendar.DATE, 1);
      
          Date x = calendar1.getTime();
          Date xy = calendar2.getTime();
          long diff = x.getTime() - xy.getTime();
          diffMinutes = diff / (60 * 1000);
          float diffHours = diffMinutes / 60;
          System.out.println("diff hours" + diffHours);
      

      【讨论】:

      • 不错的答案,帮帮我:)
      【解决方案6】:

      先生,您可以轻松使用 java 功能。 long difference = date2.getTime() - date1.getTime(); 看看这个link 这会对你有所帮助。

      【讨论】:

      • 我试过这个链接,但我没有提供日期和输入,我需要只使用时间来获取时差。我可以提供 am 或 pm 值。
      • 好的,在后台设置日期并传递它。当您从中传递上午/下午时,您可以将第二次的日期更新为明天/今天。你明白我的意思了吗?
      猜你喜欢
      • 2012-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-18
      相关资源
      最近更新 更多