以分钟为单位的两个日期之间的差异-不同的月份-Java
我想找出两次约会之间的分钟差。如果两个日期在同一个月(和一年),我的代码运行良好,但似乎每个月的差异都是31天,因此对于日期:以分钟为单位的两个日期之间的差异-不同的月份-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()
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
类。我创建的日期是错误的。比如@Thomas Kläger注意到date
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 );