Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
以分钟为单位的两个日期之间的差异-不同的月份-Java_Java_Date_Date Arithmetic - Fatal编程技术网

以分钟为单位的两个日期之间的差异-不同的月份-Java

以分钟为单位的两个日期之间的差异-不同的月份-Java,java,date,date-arithmetic,Java,Date,Date Arithmetic,我想找出两次约会之间的分钟差。如果两个日期在同一个月(和一年),我的代码运行良好,但似乎每个月的差异都是31天,因此对于日期: 2016-02-29 12:21 2016-03-1 12:21 我有4320分钟或72小时 用于: 我有2880分钟或48小时 我的代码,其中d1和d2是日期对象: long getDateDiff(Date d1, Date d2, TimeUnit timeUnit) { long diff = d2.getTime() - d1.getTime()

我想找出两次约会之间的分钟差。如果两个日期在同一个月(和一年),我的代码运行良好,但似乎每个月的差异都是31天,因此对于日期:

 2016-02-29 12:21
 2016-03-1 12:21
我有4320分钟或72小时

用于:

我有2880分钟或48小时

我的代码,其中d1和d2是日期对象:

long getDateDiff(Date d1, Date d2, TimeUnit timeUnit) {
    long diff = d2.getTime() - d1.getTime(); //in millisec
    long diffMinutes = TimeUnit.MILLISECONDS.toMinutes(diff);
    return diffMinutes;
}

我觉得你的结果很奇怪。所以我试了一下:

    @Test
public void differenceDateTest() throws ParseException {
    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm");
    Date date = dateFormat.parse("2016-02-29 12:21");
    Date date2 = dateFormat.parse("2016-03-01 12:21");
    System.out.println(date2.getTime() - date.getTime());
    long mili = date2.getTime() - date.getTime();
    System.out.println(TimeUnit.MILLISECONDS.toHours(mili)); // 24 hours.
}

它正好在24小时后返回

我认为日期对象的顺序并不重要,所以我使用了
Math.abs()

此方法为您的测试用例返回1440分钟,这些测试用例是:

Date d1 = convert(new org.joda.time.LocalDateTime(2016, 4, 30, 12, 0, 0, 0));
Date d2 = convert(new org.joda.time.LocalDateTime(2016, 5, 1, 12, 0, 0, 1));
assertEquals(1440, getMinuteDifference(d1, d2));

Date d3 = convert(new org.joda.time.LocalDateTime(2016, 2, 29, 12, 0, 0, 0));
Date d4 = convert(new org.joda.time.LocalDateTime(2016, 3, 1, 12, 0, 0, 1));
assertEquals(1440, getMinuteDifference(d3, d4));
tl;博士 解析输入字符串

LocalDateTime startLdt = LocalDateTime.parse( "2016-04-30T12:21" ) ;
LocalDateTime stopLdt = LocalDateTime.parse( "2016-05-01T12:21") ;
指定时区或与UTC的偏移量(预期但从输入中忽略)。我假设您想要UTC本身(零的偏移量)

以天(24小时的时间段)、小时、分钟、秒和纳秒为单位计算经过的时间

Duration d = Duration.between( start , stop ) ;
d、 toString():PT24H

您的第一个示例将在24小时内生成结果,正如您所看到的

您的第二个示例也会导致24小时,如下所示

细节 这个问题和其他答案都使用了麻烦的旧日期时间类或库。这两个类都被java.time类取代

使用java.time 将
日期
对象转换为
即时
对象,与java.time中的对象等效。该类表示时间线上的一个时刻,分辨率为(小数点的九(9)位)

使用(或
期间
)作为两者之间的时间跨度

Duration d = Duration.between( start , stop );
提取整个时间跨度内的总分钟数

long minutes = d.toMinutes() ;
时区 您没有提到预期的时区,例如日期时间值。他们的背景是什么?或者你打算在某个特定的时区。在不同的时区,夏时制(DST)等异常情况意味着白天并不总是24小时长。因此,时区至关重要

让我们看看UTC

// of(int year, int month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond, ZoneOffset offset)
OffsetDateTime odtStart1 = OffsetDateTime.of ( 2016 , 2 , 29 , 12 , 21 , 0 , 0 , ZoneOffset.UTC );
OffsetDateTime odtStop1 = OffsetDateTime.of ( 2016 , 3 , 1 , 12 , 21 , 0 , 0 , ZoneOffset.UTC );
Duration d1 = Duration.between ( odtStart1 , odtStop1 );

OffsetDateTime odtStart2 = OffsetDateTime.of ( 2016 , 4 , 30 , 12 , 21 , 0 , 0 , ZoneOffset.UTC );
OffsetDateTime odtStop2 = OffsetDateTime.of ( 2016 , 5 , 1 , 12 , 21 , 0 , 0 , ZoneOffset.UTC );
Duration d2 = Duration.between ( odtStart2 , odtStop2 );

System.out.println ( odtStart1 + "/" + odtStop1 + " = " + d1 );
System.out.println ( odtStart2 + "/" + odtStop2 + " = " + d2 );
2016-02-29T12:21Z/2016-03-01T12:21Z=PT24小时

2016-04-30T12:21Z/2016-05-01T12:21Z=PT24小时

toString
生成的字符串是标准字符串。
P
标记开始,而
T
将任何年、月、日部分与任何时、分、秒部分分开

在这两种情况下,结果都是24小时。这是正确的,因为在每种情况下,您都选择从一个月的最后一天到下个月的第一天。UTC没有异常情况,因此我们预计正好24小时过去

您可以通过调用来比较
持续时间
对象。你可以通过数学计算得出它们之间的差异。在这种情况下,我们期望一个不同的零

OffsetDateTime start = startLdt.atOffset( ZoneOffset.UTC );
OffsetDateTime stop = stopLdt.atOffset( ZoneOffset.UTC ) ;
Duration difference = d1.minus( d2 );
difference.toString():PT0S

看这个


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*

从哪里获得java.time类

  • 、和更高版本-标准Java API的一部分,带有捆绑实现。
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类

    • 对于早期的Android(Java中的
      Date
      仅代表自纪元以来的一个时间点,因此,如果您希望两个日期之间的差值为分钟、小时或天,您当前的方法应该有效。如果您希望以月为单位进行差值,这将需要更多的工作。可能会错误地分析或计算日期的副本。
      getDateDiff
      除了函数中根本没有使用
      时间单位之外,我对我有效。两个日期我都得到1440。根据您的输入,您应该得到24小时和24小时,但不是72小时和48小时。您如何创建
      日期
      实例?我问,因为
      新日期(2016,2,29,12,21)
      没有给出您期望的日期(你得到的日期是
      3916-03-29 12:21
      )询问者仍然必须正确创建
      date
      对象,使用零基月,或者更好,完全避免使用旧的
      date
      类。我创建的日期是错误的。比如@Thomas Kläger注意到
      long minutes = d.toMinutes() ;
      
      // of(int year, int month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond, ZoneOffset offset)
      OffsetDateTime odtStart1 = OffsetDateTime.of ( 2016 , 2 , 29 , 12 , 21 , 0 , 0 , ZoneOffset.UTC );
      OffsetDateTime odtStop1 = OffsetDateTime.of ( 2016 , 3 , 1 , 12 , 21 , 0 , 0 , ZoneOffset.UTC );
      Duration d1 = Duration.between ( odtStart1 , odtStop1 );
      
      OffsetDateTime odtStart2 = OffsetDateTime.of ( 2016 , 4 , 30 , 12 , 21 , 0 , 0 , ZoneOffset.UTC );
      OffsetDateTime odtStop2 = OffsetDateTime.of ( 2016 , 5 , 1 , 12 , 21 , 0 , 0 , ZoneOffset.UTC );
      Duration d2 = Duration.between ( odtStart2 , odtStop2 );
      
      System.out.println ( odtStart1 + "/" + odtStop1 + " = " + d1 );
      System.out.println ( odtStart2 + "/" + odtStop2 + " = " + d2 );
      
      Duration difference = d1.minus( d2 );