如何在android中获得2次的差异

时间:2012-04-19 10:16:55

标签: java android calendar

我想找出当前系统时间与插入数据和时间String之间的差异。我试过这个:

 try {

            String strFileDate = "2012-04-19 15:15:00";
            DateFormat formatter2 = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss");
            Date date = formatter2.parse(strFileDate);
            long difference = date.getTime() - System.currentTimeMillis();
            Calendar calendar = Calendar.getInstance();
            calendar.setTimeInMillis(difference);
            Toast.makeText(getBaseContext(),
                    formatter2.format(calendar.getTime()), Toast.LENGTH_LONG)
                    .show();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 

但它没有给我正确的结果。我做得对吗?

更新

我试过跟着::

String strFileDate = "2012-04-19 15:15:00";
            DateFormat formatter2 = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss");
            Date date = formatter2.parse(strFileDate);
            long diffInMs = date.getTime()
                    - new Date(System.currentTimeMillis()).getTime();

            long diffInSec = TimeUnit.MILLISECONDS.toSeconds(diffInMs);

            long hour = diffInSec / (1000 * 60 * 60);
            double minutes = diffInSec / (1000 * 60);
            // long diffInHour = TimeUnit.to(diffInMs);

            Toast.makeText(getBaseContext(),
                    "left time is :: " + hour + ":" + minutes,
                    Toast.LENGTH_LONG).show();

输出: 剩余时间是:: -2:-131.0

更新(20/4/2012)

try {
            Date dt = new Date();
            String strFileDate = "2012-04-20 13:10:00";
            DateFormat formatter2 = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss");
            Date date = formatter2.parse(strFileDate);
            String s = getTimeDiff(dt, date);
            Log.i("Date is :: >>> ", s);
        } catch (Exception e) {
            e.printStackTrace();
        }
 public String getTimeDiff(Date dateOne, Date dateTwo) {
        String diff = "";
        long timeDiff = Math.abs(dateOne.getTime() - dateTwo.getTime());
        diff = String.format("%d hour(s) %d min(s)", TimeUnit.MILLISECONDS.toHours(timeDiff),
                TimeUnit.MILLISECONDS.toMinutes(timeDiff) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(timeDiff)));
        return diff;

}

输出: 04-20 12:48:06.629: INFO / Date是::>>>(1295):2183小时38分钟

5 个答案:

答案 0 :(得分:5)

String strFileDate = "2012-04-19 15:15:00";
DateFormat formatter2 = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss");
Date date = formatter2.parse(strFileDate);
long diffInMs = date.getTime() - new Date(System.currentTimeMillis()).getTime();


long diffInSec = TimeUnit.MILLISECONDS.toSeconds(diffInMis);

long diffInHour = TimeUnit.MILLISECONDS.toHours(diffInMis);

使用TimeUnit获取秒数。 http://developer.android.com/reference/java/util/concurrent/TimeUnit.html

编辑:

获取TIMEUNIT Code here

public String getTimeDiff(Date dateOne, Date dateTwo) {
        String diff = "";
        long timeDiff = Math.abs(dateOne.getTime() - dateTwo.getTime());
        diff = String.format("%d hour(s) %d min(s)", TimeUnit.MILLISECONDS.toHours(timeDiff),
                TimeUnit.MILLISECONDS.toMinutes(timeDiff) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(timeDiff)));
        return diff;
}

答案 1 :(得分:1)

使用JodaTime计算周期(时差)。 http://joda-time.sourceforge.net/

答案 2 :(得分:1)

    Calendar calendar = Calendar.getInstance();
calendar.setTime(date.getYear(),date.getMonth(),date.getDay(),date.getHourOFday(),date.getMinutes(),date.getSeconds); // not syntactically right..
long difference = System.currentTimeMillis()-calendar.getTimeInMillis();

并以小时计算差异

double hour = difference/(1000*60*60);
double minutes = difference/(1000*60);

答案 3 :(得分:0)

  • 你得到什么输出?
  • 您期望什么输出?

如果您需要这几秒钟,请参阅#3960661

答案 4 :(得分:0)

TL;博士

ChronoUnit.MINUTES.between(
    LocalDateTime.parse( "2012-04-19 15:15:00".replace( " " , "T" ) ).atZone( ZoneId.of( "Pacific/Auckland" ) ) ,
    LocalDateTime.parse( "2012-04-19 23:49:00".replace( " " , "T" ) ).atZone( ZoneId.of( "Pacific/Auckland" ) ) 
)
  

514

时区

您的代码忽略了时区的关键问题。

java.util.Date类代表UTC的时刻。同时,您的输入字符串" 2012-04-19 15:15:00"没有任何时区指示或从UTC偏移。您必须将该值显式放入预期/所需区域/偏移的上下文中,否则这些遗留类将隐式应用区域/偏移。

java.time

现代方法使用Java 8及更高版本中内置的 java.time 类。

您的输入几乎符合标准ISO 8601格式。在中间切换该空格为T

String input = "2012-04-19 15:15:00".replace( " " , "T" ) ;  // Convert to ISO 8601 format.

解析为LocalDateTime对象,因为您的输入缺少区域或偏移。

LocalDateTime ldt = LocalDateTime.parse( input ) ;

应用您确定的用于该输入的区域或偏移。

OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC ) ; // Or some other offset.

...或...

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = ldt.atZone( z ) ;

如果您希望两个时刻之间的增量作为未连接到时间轴的时间跨度缩放为小时 - 分钟 - 秒,请计算Duration

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

类似,但按年 - 月 - 天缩放,使用Period。提取LocalDate仅限日期的对象以提供Period的工厂方法。

Period p = Period.between( start.toLocalDate() , stop.toLocalDate() ) ;

总耗时

如果您想要一个经过的总分钟数,秒数等,请在ChronoUnit::between枚举上使用ChronoUnit方法。

long totalMinutes = ChronoUnit.MINUTES.between( start , stop ) ;  // Calculate total number of minutes in entire span of time.

生成字符串

standard ISO 8601 format中生成一个字符串。只需致电Duration::toStringPeriod::toString

格式为PnYnMnDTnHnMnS,其中P标记开头,T将任意年 - 月 - 天与任何小时 - 分钟 - 秒分开。

String output = d.toString() ;

您可以通过调用各种getter方法来查询部件。

提示:如果您使用这么多时间,请将 ThreeTen-Extra 库添加到项目中以使用Interval和{ {1}}课程。

关于 java.time

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

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

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

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

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore