【问题标题】:How to get the minutes from two times in java如何在java中从两次中获取分钟数
【发布时间】:2015-05-15 10:36:45
【问题描述】:

我试图在两个小时之间获得差异,如下所示

String time1 = "05:00 AM";
String time2 = "06:20 AM";

String format = "HH:mm aa";

SimpleDateFormat sdf = new SimpleDateFormat ( format );

Date dateObj1 = null;
Date dateObj2 = null;
try {
    dateObj1 = sdf.parse ( time1 );
    dateObj2 = sdf.parse ( time2 );
} catch ( ParseException e ) {
    e.printStackTrace ( );
}

long diff = dateObj2.getTime ( ) - dateObj1.getTime ( );
double diffInHours = diff / ( ( double ) 1000 * 60 * 60 );
double diffInMins = ( diffInHours + ( int ) diffInHours ) * 60;

转储到控制台。

System.out.println ( "diff: " + diff );
System.out.println ( "diffInHours: " + diffInHours );
System.out.println ( "diffInMins " + diffInMins );

运行时。

diffInHours 1.3333333333333333
Minutes 139.99999999999997

我想以分钟为单位计算两次之间的时间,就像在上述情况下我应该得到 80 分钟,但它给出了一些其他值。

有人能帮我在两次之间获得分钟吗?

【问题讨论】:

  • 如果您得到diff(毫秒) 并将其除以 1000,您将获得秒,然后将它们除以 60,您将获得分钟。反正80分钟就是4800000毫秒,试试打印diff看看是否匹配。

标签: java date time date-format


【解决方案1】:

使用 Java 8,它可能看起来像这样:

DateTimeFormatter fmt = DateTimeFormatter.ofPattern("hh:mm a");
LocalTime t1 = LocalTime.parse(time1, fmt);
LocalTime t2 = LocalTime.parse(time2, fmt);
long minutes = ChronoUnit.MINUTES.between(t1, t2); //80

请注意,这不会考虑任何 DST 更改。

【讨论】:

  • t1.until(t2, ChronoUnit.MINUTES)
【解决方案2】:

以分钟为单位的结果就是以小时为单位的结果乘以 60:

System.out.println("Minutes " + (diffInHours)*60 );

我不明白你正在做的计算。如果你想要剩下的,你应该删除小时的整数部分:

System.out.println("Minutes " + (diffInHours - (int)diffInHours)*60 );

返回 20(所以你有 1 小时 20 分钟)。

【讨论】:

    【解决方案3】:

    The answeryannick1976 是正确的。问题代码中计算分钟数的数学不正确。

    另一个错误:格式化模式字符串显然不正确。 “AM”/“PM”的存在意味着HH 应该是hh(小写)。大写HH 表示24 小时制,而hh 小写表示12 小时半天制。此错误不会影响给定的示例输入,但对于下午/晚上的输入会失败。

    这个问题是另一个例子,说明为什么应该使用日期时间库而不是自己滚动。

    乔达时间

    我不清楚问题是在寻找以分钟为单位的总经过时间 [a] 还是以小时和分钟为单位的 [b],其中分钟是一小时的一小部分。下面的示例代码涵盖了这两种情况。

    Joda-Time 库提供了一个 Minutes 类,可以计算总经过的分钟数。

    Joad-Time 还提供三个类以各种方式表示时间跨度:IntervalPeriodDuration

    Interval 代表时间轴上的一对点。期间将其转换为天数、小时数等。

    默认情况下,Period 类以ISO 8601 标准指定的格式创建字符串表示形式:PnYnMnDTnHnMnS 其中P 标记开始,T 将日期部分与时间部分分开。所以PT1H20M 在我们的例子中是一小时二十分钟。

    示例代码

    从我们的输入字符串开始。

    String inputStart = "05:00 AM";
    String inputStop = "06:20 AM";
    

    这些输入字符串仅表示时间,没有任何日期或时区。所以让我们将它们解析为LocalTime 对象。

    DateTimeFormatter formatter = DateTimeFormat.forPattern ( "hh:mm aa" );
    LocalTime startTime = LocalTime.parse ( inputStart, formatter );
    LocalTime stopTime = LocalTime.parse ( inputStop, formatter );
    

    Minutes 类和 Interval/Period 类都需要日期时间实例,而不是仅时间实例。所以让我们转换为DateTime,任意选择今天作为日期部分。我们将UTC 指定为时区以避免Daylight Saving Time 或其他异常情况。

    DateTime start = startTime.toDateTimeToday ( DateTimeZone.UTC );  // Use UTC to avoid DST and other anomalies, as we want general elapsed time rather than on any specific day.
    DateTime stop = stopTime.toDateTimeToday ( DateTimeZone.UTC );
    

    现在我们有一对DateTime 对象,我们可以使用Minutes 类的静态方法来计算总经过的分钟数。 minutesBetween 方法返回一个对象,因此我们也调用 getMinutes 来获取一个简单的 int 数字。鉴于我们的示例输入,我们期望 80

    int elapsedMinutes = Minutes.minutesBetween ( start, stop ).getMinutes ( );
    

    要获得小时分钟而不是总分钟数,让我们定义一个时间跨度。

    Interval interval = new Interval ( start, stop );
    Period period = interval.toPeriod ( );
    

    转储到控制台。

    System.out.println ( "In UTC, from " + inputStart + " to " + inputStop + " is interval: " + interval + " and period: " + period + ", or " + period.getHours ( ) + " hours and " + period.getMinutes ( ) + " minutes. In total elapsed minutes: " + elapsedMinutes + "." );
    

    运行时。

    In UTC, from 05:00 AM to 06:20 AM is interval: 2015-05-15T05:00:00.000Z/2015-05-15T06:20:00.000Z and period: PT1H20M, or 1 hours and 20 minutes. In total elapsed minutes: 80.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 2021-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多