【问题标题】:Compare Date and Time in Java比较Java中的日期和时间
【发布时间】:2014-11-21 14:17:23
【问题描述】:

如何在java中比较三个日期/时间值?

目前我使用日期对象

我的意思是: 日期 1 - 今天,晚上 10:00 日期 2 - 明天,早上 5:00 Date3 - 当前时间

date3 在 date1 和 date2 之间,是否尊重日期和时间?

date1.compareTo(date3) * date2.compareTo(date3) > 0

date1.after(date3) && date2.before(date3)

不工作。

我在 Android 应用程序中使用此代码,如果我将时间设置为上午 11.30,它仍然会在上述条件下返回 true。如果我使用时间对象和第二种方法,它无法识别我的时间跨度在 2 天之间。

有什么想法吗?

编辑:准确地说,这是我当前的代码。应用就像一个闹钟。

            // Current Date/Time
        Date now = Calendar.getInstance().getTime();

        // Time when user goes to bed (current day)
        Date sleep = new Date(now.getYear(), now.getMonth(), now.getDate(), Shours, Sminutes);

        // Time when user wakes up (next day)
        // Get Next Day's Date and set Time
        Calendar wk = Calendar.getInstance();
        wk.setTime(sleep);
        wk.set(Calendar.HOUR_OF_DAY, Whours);
        wk.set(Calendar.MINUTE, Wminutes);
        // tomorrow
        wk.add(Calendar.DATE, 1);
        // and convert to date
        Date wake = wk.getTime();

        // Compare
        if(now.after(sleep) && now.before(wake)) {
                Log.d("uSleep", "Debug: Night time");
        }
        else {
            Log.d("uSleep", "Debug: Day Time");
        }

也许还是太难理解了。想象一下你晚上 10 点睡觉,早上 5 点起床。现在如何通过将“上床睡觉”时间和“起床”时间与当前时间进行比较来确定您是否在睡觉。我需要使用“明天”作为您的“起床”时间,否则 java 似乎会比较同一天的所有时间,这是不可能的。

【问题讨论】:

  • 您是说 Java 中的日期/时间比较从根本上被破坏了?我很难理解你在问什么。
  • “今天”不是一个时间点也无济于事。一个简短但完整的程序演示该问题将使您更容易为您提供帮助。也不清楚如何您正在使用Time 对象...
  • “现在是晚于晚上 10 点,但早于第二天早上 5 点”
  • 如果date2 是明天,你为什么要测试它是否是before date3
  • 您声称在使用 Time 类时它会失败 - 但您的代码似乎没有使用 Time 类。 (它也不是一个完整的程序……如果可能的话,如果您尝试将其复制为桌面 Java 控制台应用程序,那将非常有帮助。)

标签: java android date time


【解决方案1】:

tl;博士

Interval.of( 
    start , 
    stop 
).contains( 
    ZonedDateTime.now( ZoneId.of( "America/Montreal" ) )
                 .toInstant() 
)

详情

这个问题令人困惑,但似乎是……

如何判断某个特定时刻是否在一段时间内发生?

java.time

我的意思是:Date1 - 今天晚上 10:00 Date2 - 明天早上 5:00 Date3 - 当前时间

时区对于确定“今天”和“明天”至关重要。对于任何给定的时刻,日期在全球范围内因区域而异。例如,Paris France 中午夜过后几分钟是新的一天,而 Montréal Québec 中仍然是“昨天”。

continent/region 的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用 3-4 个字母的缩写,例如 ESTIST,因为它们不是真正的时区,没有标准化,甚至不是唯一的 (!)。

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now( z );

要获得具有另一个时间的相同日期,请提取 LocalDateLocalDate 类表示没有时间和时区的仅日期值。使用LocalTime 指定所需的时间。与ZoneId 结合得到ZonedDateTime

LocalDate today = now.toLocalDate() ;
LocalTime tenPm = LocalTime.of( 22 , 0 ) ;  // 10 PM is 22:00.
ZonedDateTime tenPmToday = ZonedDateTime.of( today , tenPm , z ) ;

要获得明天,请在今天的日期上加一天。

LocalDate tomorrow = ld.plusDays( 1 ) ;
LocalTime fiveAm = LocalTime.of( 5 , 0 ) ;
ZonedDateTime fiveAmTomorrow = ZonedDateTime.of( tomorrow ,fiveAm , z ) ;

比较

要进行比较,请调用 isBeforeisEqualisAfter 方法。

Boolean contains = ( ! now.isBefore( tenPmToday ) ) && now.isBefore( fiveAmTomorrow ) ;

当然,现在总是在明天之前,所以我不确定你的意图。

org.threeten.extra.Interval

您可能会从下面列出的ThreeTen-Extra 项目中找到对这项工作有用的Interval 类。这个类存储了一对Instant对象,并有一些方便的比较方法如contains

Instant 类表示UTC 时间线上的时刻,分辨率为nanoseconds(最多九 (9) 位小数)。

Interval interval = Interval.of( tenPmToday.toInstant() , fiveAmTomorrow.toInstant() ) ;
Boolean contains = interval.contains( now.toInstant() ) ;

关于java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

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

从哪里获得 java.time 类?

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

乔达时间

更新:Joda-Time 项目现在位于 maintenance mode,团队建议迁移到 java.time 类。

最好的方法是使用Joda-Time 库,而不是众所周知的麻烦、混乱和有缺陷的 java.util.Date/.Calendar 类。

时间跨度

在 Joda-Time 中,您可以用三种方式表示时间跨度:间隔、周期和持续时间。在这种情况下,我们需要Interval,它由时间轴中的一对特定点定义,采用半开[) 方法,其中开头包含,结尾排除。

这对特定点,以及现在的当前时刻,都由DateTime 类表示。与 java.util.Date 不同,DateTime 知道自己分配的时区。如果未指定,将应用 JVM 当前的默认时区。所以通常最好指定。

示例代码

一些使用 Joda-Time 2.5 的示例代码。

DateTimeZone zone = DateTimeZone.forID( "America/Montreal" );
DateTime now = DateTime.now( zone );
DateTime bedtime = now.withTime( 22, 0, 0, 0 );  // Today’s bedtime. May be past, future, or this very moment now.
DateTime risetime = bedtime.plusHours( 7 ); // 05:00 next morning.
Interval sleepInterval = new Interval( bedtime, risetime ); 
boolean asleep = sleepInterval.contains( now );  // Half-Open "[)" comparison, beginning is inclusive, ending exclusive.

【讨论】:

    猜你喜欢
    • 2015-07-20
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多