-1

我试图找出 Java 中的日期并且完全迷失了。我使用日期吗?使用纪元时间?公历?

假设我想存储一个日期,然后将其与其他日期进行比较。例如,我存储了一个日期“2013 年 10 月 27 日”。然后,我想稍后将其与稍后输入的日期进行比较,以查看以后的日期是否与“2013 年 10 月 27 日”相同,或者是否只有日、年或月匹配?最好的方法是什么?

4

3 回答 3

1

与 Java 7 及更早版本捆绑的 Date 和 Calendar 类是出了名的糟糕。知情人士改为使用第三方开源库Joda-Time

DateJoda-Time 具有在其对象和 Java 平台的类之间进行转换的方法。Date当您需要与需要实例的其他软件进行互操作时使用。

如果使用 Java 8,请使用受 Joda-Time 启发的新JSR 310 日期和时间 API 。有些人试图将 JSR 310 实现反向移植到 Java 7;我不知道他们是否成功了。

这是使用 Joda-Time 演示您所要求的一些内容的相同示例代码。使用风险自负;我没有彻底考虑过,也没有测试过。

// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.

// Joda-Time - The popular alternative to Sun/Oracle's notoriously bad date, time, and calendar classes bundled with Java 7 and earlier.
// http://www.joda.org/joda-time/

// Joda-Time will become outmoded by the JSR 310 Date and Time API introduced in Java 8.
// JSR 310 was inspired by Joda-Time but is not directly based on it.
// http://jcp.org/en/jsr/detail?id=310

// By default, Joda-Time produces strings in the standard ISO 8601 format.
// https://en.wikipedia.org/wiki/ISO_8601

// Capture one moment in time.
org.joda.time.DateTime now = new org.joda.time.DateTime();
System.out.println("Now: " + now);

// Calculate approximately same time yesterday.
org.joda.time.DateTime yesterday = now.minusDays(1);
System.out.println("Yesterday: " + yesterday);

// Compare dates. A DateTime includes time (hence the name).
// So effectively eliminate the time by setting to start of day.
Boolean isTodaySameDateAsYesterday = now.withTimeAtStartOfDay().isEqual(yesterday.withTimeAtStartOfDay());
System.out.println("Is today same date as yesterday: " + isTodaySameDateAsYesterday);

org.joda.time.DateTime halloweenInUnitedStates = new org.joda.time.DateTime(2013, 10, 31, 0, 0); // Uses default time zone.
Boolean isFirstMomentSameDateAsHalloween = now.withTimeAtStartOfDay().isEqual(halloweenInUnitedStates.withTimeAtStartOfDay());
System.out.println("Is now the same date as Halloween in the US: " + isFirstMomentSameDateAsHalloween);

// Wait a moment.
try {
    java.util.concurrent.TimeUnit.MILLISECONDS.sleep(300);
} catch (InterruptedException e) {
    e.printStackTrace();
}

// See if new moment is on the same date as previous moment.
// May not be same date if we rolled over the stroke of midnight.
org.joda.time.DateTime aMomentLater = new org.joda.time.DateTime();
Boolean isFirstMomentSameDateAsAMomentLater = now.withTimeAtStartOfDay().isEqual(aMomentLater.withTimeAtStartOfDay());
System.out.println("Is first moment the same date as a moment later: " + isFirstMomentSameDateAsAMomentLater);

示例运行...</p>

Now: 2013-10-27T20:36:21.406-07:00
Yesterday: 2013-10-26T20:36:21.406-07:00
Is today same date as yesterday: false
Is now the same date as Halloween in the US: false
Is first moment the same date as a moment later: true

永远不要像您提到的那样将日期存储为文本:I've stored a date "10/27/2013".

尽可能将日期保留为日期对象,例如DateTimeJoda-Time 或数据库的本机日期时间格式。如果您必须将日期时间序列化为文本,请使用可靠且可预测的格式,其中ISO 8601是显而易见的选择。如您在上面运行的示例中所见,该格式是 Joda-Time 中的默认格式。

于 2013-10-28T03:52:07.137 回答
1

在 Java 中,java.util.Date类不仅仅是 a Date,应该更准确地称为 a TimeStamp,因为它包含时间信息。

要与java.util.Date实例进行比较,您需要编写一个Comparator忽略时间信息的自定义,或者我喜欢做的是将时间信息归零。

这里有一些代码片段来管理任何java.util.Date对象的规范化,以便将时间信息归零

所有这些都是一个名为的类的静态方法DateUtil

public static boolean equalsIgnoreTime(final Date d1, final Date d2)
{
    return DateUtil.zeroTime(d1).equals(DateUtil.zeroTime(d2));
}

取决于以下静态方法:

public static Date zeroTime(final Date date)
{
    return DateUtil.setTime(date, 0, 0, 0, 0);
}

这取决于:

public static Date setTime(final Date date, final int hourOfDay, final int minute, final int second, final int ms)
{
    final GregorianCalendar gc = new GregorianCalendar();
    gc.setTime(date);
    gc.set(Calendar.HOUR_OF_DAY, hourOfDay);
    gc.set(Calendar.MINUTE, minute);
    gc.set(Calendar.SECOND, second);
    gc.set(Calendar.MILLISECOND, ms);
    return gc.getTime();
}

您对存储的引用不清楚,所以我不知道如何解决您存储的方式或内容或存储数据的位置,但如果您在 Java 代码中进行比较,则存储几乎无关紧要。

于 2013-10-28T02:01:02.217 回答
-2

使用以下代码格式化日期并存储在数据库中。对新日期使用相同的格式并执行比较。

@DateTimeFormat(pattern = "dd/MM/yyyy")
private Date date = null;
于 2013-10-28T02:04:21.697 回答