Java 使用Joda Time计算一周中的第二天和时间
我将要写一些简单的数学行,并希望确保没有一些简单的高级构造来完成这项工作 我有一个对象,它代表一周中的一天、一天中的一小时和一分钟。例如“星期三上午10:14” 我想计算下一次发生之前的毫秒数。例如,如果现在是星期四10:14,那么它将相当于6天的毫秒。这是因为星期三已经过去了,所以需要6天才能到达下一个星期三。如果现在是星期三10:13.0001,那将是999 在Joda Time中是否有一个高层次的构造,这样我就可以在一两行代码中完成这项工作,或者我是否需要自己进行计算(包括边缘案例,以包装像DOWJava 使用Joda Time计算一周中的第二天和时间,java,jodatime,Java,Jodatime,我将要写一些简单的数学行,并希望确保没有一些简单的高级构造来完成这项工作 我有一个对象,它代表一周中的一天、一天中的一小时和一分钟。例如“星期三上午10:14” 我想计算下一次发生之前的毫秒数。例如,如果现在是星期四10:14,那么它将相当于6天的毫秒。这是因为星期三已经过去了,所以需要6天才能到达下一个星期三。如果现在是星期三10:13.0001,那将是999 在Joda Time中是否有一个高层次的构造,这样我就可以在一两行代码中完成这项工作,或者我是否需要自己进行计算(包括边缘案例,以包装
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();
}
我会这样做:
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();
}
}
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);
}
}
还没有听说过任何现成的方法可以在Joda中实现这一点…以下是我自己想到的。不过,如果有一个代码行更少的解决方案就好了。他们白天是我工作的班级。它包含一周中的一天和一天中的一小时
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()));
}
不太清楚你在做什么。但是如果您想要的是以毫秒为单位的倒计时,我将使用Joda Time类及其方法。乘以1000以报告大约毫秒。在最后一秒钟,如果您确实需要,请切换档位以使用
.getMillis
方法。您可以执行以下操作:
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();
}
}
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);
}
}
对不起,我听不懂你的逻辑;你能把规则说得更清楚些吗?在“星期三上午10:14”和“星期四上午10:14”之间,据我所知,只有一天的毫秒值得……我编辑了一下,让它更清楚。记住,这是一周中的每一天,每一周都在重复。因此,如果是星期四,我们没有时间机器将时间返回到星期三,我们必须计算到下一个星期三的时间。好的,那么它是指
DateTime.now()
?时区呢?参见示例。时区并不重要,因为它是单个JVM实例中的持续时间算法。@如果某个系统管理员或用户更改了机器的默认时区,或者同一JVM中的其他Java代码笨拙地更改了JVM的默认时区,则user1888440时区将起作用。更好的做法是总是指定你的时区。谢谢!你能告诉我你是否认为这比我试图回答我自己的问题要好?如果你不理解这个问题,为什么要添加一个答案?@user1888440(a)表明Joda Time确实有一些类用于计算日期时间之间的增量,以特定单位,例如秒。这似乎是问题和其他答案的目的。(b) 和其他人一样,指出你的问题写得不好,同时指出一种可能更好的表达方式。张贴的两个答案似乎完全理解这个问题(而且都是正确的),但感谢你的输入。在未来,我认为你会得到更好的结果,在评论中要求澄清而不是回答。这让海报有机会更准确地表达问题。