【问题标题】:Use Joda-Time to Calculate the next Day of the Week with Time使用 Joda-Time 用时间计算一周中的下一天
【发布时间】:2014-03-27 02:57:30
【问题描述】:

我即将写一些简单的数学运算,并想确保Joda-Time 中没有一些简单的高级构造可以做到这一点。

我有一个对象,它代表一周中的一天、一天中的一个小时和一小时的一分钟。例如“星期三上午 10:14”。

我想计算下一次发生前的毫秒数。例如,如果现在是星期四的 10:14,那么这将是 6 天的毫秒数。这是因为星期三已经过去,所以到下一个星期三需要 6 天。如果现在是星期三 10:13.0001,它将是 999。

Joda-Time 中是否有高级构造,所以我可以用一两行代码来完成这项工作,还是我需要自己做数学计算(包括包装 DOW

谢谢!

这是我的新手尝试,还不能给你一些参考:

public MutableDateTime getDateTime() {
    MutableDateTime date = MutableDateTime.now();
    date.setDayOfWeek(this.day);
    date.setHourOfDay(this.hour);
    return date;
}

public long getTimeUntilNextFrom( DateTime from ) {
    MutableDateTime to = getDateTime();
    if (to.isBefore( from )) {
        to.setWeekOfWeekyear(from.getWeekOfWeekyear() + 1);
    }

    return new Interval(from, to).toDurationMillis();
}

【问题讨论】:

  • 你的逻辑让我无法理解,对不起;你能让规则更明确吗?在“星期三上午 10:14”和“星期四上午 10:14”之间,据我所知,只有一天的毫秒值......
  • 我进行了编辑以使其更清晰。请记住,这些是一周中的几天,并且几周会重复出现。所以如果是星期四,我们没有时间机器可以及时回到星期三,我们必须计算到下一个星期三的时间。
  • 好的,所以它是参考DateTime.now()?时区呢?
  • 查看示例。时区无关紧要,因为它是单个 JVM 实例中的持续时间算法。
  • @user1888440 如果某些系统管理员或用户更改了机器的默认时区,或者同一 JVM 中的其他 Java 代码笨拙地更改了 JVM 的默认时区,则时区将很重要。更好的做法是始终指定您的时区。

标签: java jodatime


【解决方案1】:

你可以这样做:

import org.joda.time.DateTime;
import org.joda.time.DateTimeConstants;
import org.joda.time.Interval;
import org.joda.time.LocalTime;

public class Main {
    public static void main(String[] args) {
        Interval interval = betweenNowAndNext(DateTimeConstants.MONDAY, new LocalTime(10, 14));
        System.out.println(interval.toDurationMillis());
    }

    public static Interval betweenNowAndNext(int dayOfWeek, LocalTime time) {
        DateTime now = DateTime.now();
        DateTime closest = time.toDateTime(now).withDayOfWeek(dayOfWeek);
        return new Interval(now, closest.isBefore(now) ? closest.plusWeeks(1) : closest);
    }
}

【讨论】:

    【解决方案2】:

    我会这样做:

    public class DistanceCalculator {
        public long getMillisecondTillNext(int dayOfWeek, int hourOfDay, int minuteOfHour) {
            DateTime now = DateTime.now();
            DateTime next = DateTime.now().withDayOfWeek(dayOfWeek).withHourOfDay(hourOfDay).withMinuteOfHour(minuteOfHour);
            long distance = next.getMillis() - now.getMillis();
            return distance > 0 ? distance : week() - distance;
        }
    
        private long week() {
            return new DateTime(0).plusWeeks(1).getMillis();
        }
    }
    

    还没有听说过任何现成的方法可以在 Joda 中得到这个...

    【讨论】:

    • 谢谢!如果您认为这比我尝试回答我自己的问题更好,您能告诉我吗?
    【解决方案3】:

    这是我自己想出的。不过,如果能以更少的代码行找到解决方案,那就太好了。他们的 DayHour 是我正在使用的课程。它包含一周中的一天和一天中的小时。

    public class DayHour {
        int day;
        int hour;
    
        public DayHour(int day, int hour) {
            this.day = day;
            this.hour = hour;
        }
    
        public MutableDateTime getDateTime(DateTime base) {
            MutableDateTime date = base.toMutableDateTime();
            date.setDayOfWeek(this.day);
            date.setHourOfDay(this.hour);
            return date;
        }
    
        public long getTimeUntilNextFrom(DateTime from) {
            MutableDateTime to = getDateTime(from);
            if (to.isBefore(from)) {
                to.setWeekOfWeekyear(from.getWeekOfWeekyear() + 1);
            }
    
            return new Interval(from, to).toDurationMillis();
        }
    }
    
    @Test
    public void testDayHour() {
        DateTime now = DateTime.now();
        DayHour date = new DayHour(now.getDayOfWeek(), now.getHourOfDay());
    
        MutableDateTime yesterday = now.toMutableDateTime();
        yesterday.addDays(-1);
        assertEquals(TimeUnit.DAYS.toMillis(1), date.getTimeUntilNextFrom(yesterday.toDateTime()));
    
        MutableDateTime tomorrow = now.toMutableDateTime();
        tomorrow.addDays(1);
        assertEquals(TimeUnit.DAYS.toMillis(6), date.getTimeUntilNextFrom(tomorrow.toDateTime()));
    }
    

    【讨论】:

      【解决方案4】:

      不太清楚你在做什么。但是,如果您想要的是以毫秒为单位的倒计时,我会使用 Joda-Time Seconds 类及其 secondsBetween 方法。乘以 1,000 以报告大约毫秒。如果您确实需要,请在最后一秒切换到使用.getMillis 方法。

      【讨论】:

      • 看不懂问题为什么还要加答案?
      • @user1888440 (a) 为了表明 Joda-Time 确实有一些类可以计算日期时间之间的增量,例如秒。这似乎是问题和其他答案的目的。 (b) 像其他人一样指出您的问题写得不好,同时指出可能更好的表达方式。
      • 发布的两个答案似乎完全理解了这个问题(而且都是正确的),但感谢您的意见。在未来,我认为你会得到更好的结果,要求在 cmets 中进行澄清而不是答案。这让发帖人有机会更准确地表达问题。
      猜你喜欢
      • 1970-01-01
      • 2011-06-26
      • 2021-04-08
      • 2011-01-12
      • 1970-01-01
      • 1970-01-01
      • 2010-10-24
      • 2011-06-13
      • 1970-01-01
      相关资源
      最近更新 更多