仅比较两个日期的时间部分,忽略日期部分

kol*_*rie 31 java time datetime date

给定两个Date对象,比较它们的时间部分之间的差异,完全忽略年,月和日,有什么好方法?

这与这个问题完全相反.

更新:这是未来参考的最终代码:

private long differenceBetween(Date currentTime, Date timeToRun)
{
    Calendar currentCal = Calendar.getInstance();
    currentCal.setTime(currentTime);

    Calendar runCal = Calendar.getInstance();
    runCal.setTime(timeToRun);
    runCal.set(Calendar.DAY_OF_MONTH, currentCal.get(Calendar.DAY_OF_MONTH));
    runCal.set(Calendar.MONTH, currentCal.get(Calendar.MONTH));
    runCal.set(Calendar.YEAR, currentCal.get(Calendar.YEAR));

    return currentCal.getTimeInMillis() - runCal.getTimeInMillis();
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*ble 31

如果要比较日期的基础二进制(long int)值,可以执行以下操作:

public int compareTimes(Date d1, Date d2)
{
    int     t1;
    int     t2;

    t1 = (int) (d1.getTime() % (24*60*60*1000L));
    t2 = (int) (d2.getTime() % (24*60*60*1000L));
    return (t1 - t2);
}
Run Code Online (Sandbox Code Playgroud)

附录1

这种技术具有速度的优势,因为它直接使用对象的基础longDate,而不是在刻度和日历组件之间进行转换(这相当昂贵且缓慢).它比乱搞Calendar对象要简单得多.

附录2

上面的代码将时间差作为a返回int,这对于任何一对都是正确的,因为它完全忽略日期的年/月/日部分,并且任何两次之间的差异不超过86,400,000 ms(= 1000毫秒/秒×60秒/分钟×60分钟/小时×24小时/天).


Jam*_*mes 19

您可以考虑将Joda时间DateTimeComparator.getTimeOnlyInstance()用于比较器,该比较器将仅根据时间比较两个Joda日期.

例如:

DateTimeComparator comparator = DateTimeComparator.getTimeOnlyInstance();
comparator.compare(date1, date2);
Run Code Online (Sandbox Code Playgroud)

请参阅http://joda-time.sourceforge.net/api-release/org/joda/time/DateTimeComparator.html#getTimeOnlyInstance()


Bas*_*que 6

tl;博士

Duration                                  // Span of time, with resolution of nanoseconds.
.between(                                 // Calculate elapsed time.
    LocalTime.now(                        // Get current time-of-day…
        ZoneId.of( "Pacific/Auckland" )   // … as seen in a particular time zone.
    )                                     // Returns a `LocalTime` object.
    ,
    myJavaUtilDate                        // Avoid terrible legacy date-time classes such as `java.util.Date`.
    .toInstant()                          // Convert from `java.util.Date` to `java.time.Instant`, both representing a moment in UTC.
    .atZone(                              // Adjust from UTC to a particular time zone. Same moment, same point on the timeline, different wall-clock time.
        ZoneId.of( "Pacific/Auckland" )   // Specify time zone by proper naming in `Continent/Region` format, never 2-4 letter pseudo-zones such as `PST`, `CEST`, `CST`, `IST`, etc.
    )                                     // Returns a `ZonedDateTime` object.
    .toLocalTime()                        // Extract the time-of-day without the date and without a time zone.
)                                         // Returns a `Duration` object.
.toMillis()                               // Calculate entire span-of-time in milliseconds. Beware of data-loss as `Instant` uses a finer resolution the milliseconds, and may carry microseconds or nanoseconds.
Run Code Online (Sandbox Code Playgroud)

我建议传递类型安全且不言自明的Duration对象,而不仅仅是整数毫秒。

时间

现代方法使用java.time类取代了可怕的遗留类,例如Date, Calendar, SimpleDateFormat

Java 中所有日期时间类型的表,包括现代的和传统的

将您的java.util.Date(UTC 时间)转换为Instant. 使用添加到旧类的新转换方法。

Instant instant = myJavaUtilDate.toInstant() ;
Run Code Online (Sandbox Code Playgroud)

这代表了UTC的一个时刻。确定日期和时间需要时区。对于任何给定时刻,日期和时间在全球各地因地区而异。例如,在法国巴黎午夜过后几分钟是新的一天,而在魁北克蒙特利尔仍然是“昨天” 。

如果未指定时区,JVM 会隐式应用其当前默认时区。该默认值可能会在运行时随时更改(!),因此您的结果可能会有所不同。最好将您想要/预期的时区明确指定为参数。

以、、 或等格式指定正确的时区名称。永远不要使用 2-4 个字母的缩写,例如或因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。continent/regionAmerica/MontrealAfrica/CasablancaPacific/AucklandESTIST

ZoneId z = ZoneId.of( "America/Montreal" ) ;  
Run Code Online (Sandbox Code Playgroud)

如果您想使用 JVM 的当前默认时区,请询问它并作为参数传递。如果省略,则隐式应用 JVM 的当前默认值。最好是明确的,因为JVM 中任何应用程序的任何线程中的任何代码都可能在运行时随时更改默认值。

ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.
Run Code Online (Sandbox Code Playgroud)

将 分配ZoneIdInstant以生成ZonedDateTime对象。

ZonedDateTime zdt = instant.atZone( z ) ;
Run Code Online (Sandbox Code Playgroud)

提取不带日期和时区的时间部分。

LocalTime lt = zdt.toLocalTime() ;
Run Code Online (Sandbox Code Playgroud)

相比。用 a 计算经过的时间Duration

Duration d = Duration.between( ltStart , ltStop ) ;
Run Code Online (Sandbox Code Playgroud)

请注意,这不是一个公平的比较。天并不总是 24 小时长,并且并非所有时间值在所有区域的所有天都有效。例如,在夏令时转换期间的美国,可能根本没有凌晨 2 点。所以凌晨 1 点到凌晨 4 点在一个日期可能是 3 小时,但在另一个日期只有 2 小时。


关于java.time

java.time框架是建立在Java 8和更高版本。这些类取代了麻烦的旧的遗留日期时间类,例如java.util.Date, Calendar, & SimpleDateFormat

现在处于维护模式Joda-Time项目建议迁移到java.time类。

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

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

从哪里获得 java.time 类?

哪个 java.time 库与哪个版本的 Java 或 Android 一起使用的表

ThreeTen-额外项目与其他类扩展java.time。该项目是未来可能添加到 java.time 的试验场。你可能在这里找到一些有用的类,比如IntervalYearWeekYearQuarter,和更多


nic*_*ild 5

看看Calendar课程.它支持从给定Date的时间中提取小时,分钟和秒.

Calendar calendar = Calendar.getInstance();
calendar.setTime(yourDateObject);
int hour = calendar.get(Calendar.HOUR);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);
Run Code Online (Sandbox Code Playgroud)