获取两个日期之间的周数。

28
我正在工作一个项目,有两个不同类型的日期。我想计算这两个日期之间的周数。这些日期可以在不同的年份中。有没有好的解决方案?
我尝试使用其他话题中建议的Joda-time实现这个功能。
我不熟悉这个库,但我尝试做这样的事情:
public static int getNumberOfWeeks(Date f, Date l){
    Calendar c1 = Calendar.getInstance();
    Calendar c2 = Calendar.getInstance();
    c1.setTime(f);
    c2.setTime(l);
    DateTime start = new DateTime(c1.YEAR, c1.MONTH, c1.DAY_OF_MONTH, 0, 0, 0, 0);
    DateTime end   = new DateTime(c2.YEAR, c2.MONTH, c2.DAY_OF_MONTH, 0, 0, 0, 0);
    Interval interval = new Interval(start, end);
    Period p = interval.toPeriod();
    return p.getWeeks();
}

但是这完全是错误的...有什么建议吗?


1
FYI:Joda-Time 项目现已进入维护模式。它的创始人 Stephen Colebourne 继续领导 JSR 310,定义了内置于 Java 8+ 的 java.time 类。请参阅 Oracle 的教程 - Basil Bourque
19个回答

0

简单的方法

  Calendar cal1 = new GregorianCalendar();
    Calendar cal2 = new GregorianCalendar();
    cal1.set(2014, 3, 3);
    cal2.set(2015, 3, 6);

    weekscount.setText("weeks= "+ ( (cal2.getTime().getTime() - cal1.getTime().getTime()) / (1000 * 60 * 60 * 24))/7);

0

这里有一种简单的方法来找出两个日期之间的周数。

SimpleDateFormat myFormat = new SimpleDateFormat("dd MM yyyy");
String classStartData = "31 01 2021";
String classEndData = "08 03 2021";

Date dateClassStart = myFormat.parse(classStartData);
Date dateClassEnd = myFormat.parse(classEndData);

long differenceWeek = dateClassEnd.getTime() - dateClassStart.getTime();
int programLength = (int)(TimeUnit.DAYS.convert(differenceWeek, TimeUnit.MILLISECONDS)/7);
System.out.println("Class length in weeks: " +programLength);

0

在不使用JodaTime的情况下,我能够准确地计算出两个日历之间的周数(考虑了闰年等因素)。

private fun calculateNumberOfWeeks() {
    val calendarFrom = Calendar.getInstance()
    calendarFrom.set(Calendar.HOUR_OF_DAY, 0)
    calendarFrom.set(Calendar.MINUTE, 0)
    calendarFrom.set(Calendar.SECOND, 0)
    calendarFrom.set(Calendar.MILLISECOND, 0)

    val calendarTo = Calendar.getInstance()
    calendarTo.add(Calendar.MONTH, months)
    calendarTo.set(Calendar.HOUR_OF_DAY, 0)
    calendarTo.set(Calendar.MINUTE, 0)
    calendarTo.set(Calendar.SECOND, 0)
    calendarTo.set(Calendar.MILLISECOND, 0)

    var weeks = -1
    while (calendarFrom.timeInMillis < calendarTo.timeInMillis) {
        calendarFrom.add(Calendar.DATE, 7)
        weeks++
        Log.d(Constants.LOG_TAG, "weeks $weeks")
    }
}

0
Joda Time 计算从两个日期得出的持续时间的周数,在某些情况下可能不符合我们的要求。我有一个使用 Joda Time 计算两个日期之间自然周的方法。希望它能对你有所帮助。如果你不使用 Joda Time,可以使用 Calendar 修改代码来实现相同的功能。
//Unlike Joda Time Weeks.weeksBetween() that returns whole weeks computed
//from duration, we return natural weeks between two dates based on week of year
public static int weeksBetween(ReadablePartial date1, ReadablePartial date2) {
    int comp = date1.compareTo(date2);
    if (comp == 0) {
        return 0;
    }

    if (comp > 0) {
        ReadablePartial mid = date2;
        date2 = date1;
        date1 = mid;
    }

    int year1 = date1.get(DateTimeFieldType.weekyear());
    int year2 = date2.get(DateTimeFieldType.weekyear());

    if (year1 == year2) {
        return date2.get(DateTimeFieldType.weekOfWeekyear()) - date1.get(DateTimeFieldType.weekOfWeekyear());
    }

    int weeks1 = 0;

    LocalDate lastDay1 = new LocalDate(date1.get(DateTimeFieldType.year()), 12, 31);
    if (lastDay1.getWeekyear() > year1) {
        lastDay1 = lastDay1.minusDays(7);
        weeks1++;
    }

    weeks1 += lastDay1.getWeekOfWeekyear() - date1.get(DateTimeFieldType.weekOfWeekyear());

    int midWeeks = 0;
    for (int i = year1 + 1; i < year2; i++) {
        LocalDate y1 = new LocalDate(i, 1, 1);
        int yearY1 = y1.getWeekyear();
        if (yearY1 < i) {
            y1 = y1.plusDays(7);
            midWeeks++;
        }

        LocalDate y2 = new LocalDate(i, 12, 31);
        int yearY2 = y2.getWeekyear();
        if (yearY2 > i) {
            y2 = y2.minusDays(7);
            midWeeks++;
        }

        midWeeks += y2.getWeekOfWeekyear() - y1.getWeekOfWeekyear();
    }

    int weeks2 = 0;
    LocalDate firstDay2 = new LocalDate(date2.get(DateTimeFieldType.year()), 1, 1);
    if (firstDay2.getWeekyear() < firstDay2.getYear()) {
        firstDay2 = firstDay2.plusDays(7);
        weeks2++;
    }
    weeks2 += date2.get(DateTimeFieldType.weekOfWeekyear()) - firstDay2.getWeekOfWeekyear();

    return weeks1 + midWeeks + weeks2;
}

0
你可以按照以下方式完成:
// method header not shown
// example dates:
f = new GregorianCalendar(2009,Calendar.AUGUST,1);
l = new GregorianCalendar(2010,Calendar.SEPTEMBER,1);
DateTime start = new DateTime(f);
DateTime end = new DateTime(l);
// Alternative to above - example dates with joda:
// DateTime start = new DateTime(2009,8,1,0,0,0,0);
// DateTime end = new DateTime(2010,9,1,0,0,0,0);
Interval interval = new Interval(start,end);
int weeksBetween = interval.toPeriod(PeriodType.weeks()).getWeeks();
// return weeksBetween;

这应该会给你一个代表两个日期之间周数的整数。


如果您使用nansen的答案,您不需要上面示例中的Interval行。这甚至更好。 - Joje

0
private int weeksBetween(Calendar startDate, Calendar endDate) {
    startDate.set(Calendar.HOUR_OF_DAY, 0);
    startDate.set(Calendar.MINUTE, 0);
    startDate.set(Calendar.SECOND, 0);
    int start = (int)TimeUnit.MILLISECONDS.toDays(
        startDate.getTimeInMillis())
        - startDate.get(Calendar.DAY_OF_WEEK);
    int end = (int)TimeUnit.MILLISECONDS.toDays(
        endDate.getTimeInMillis());
    return (end - start) / 7;
}

如果此方法返回0,则它们在同一周。
如果此方法返回1,则endDate是startDate的下一周。
如果此方法返回-1,则endDate是startDate的上一周。
你明白了。

请不要发布重复答案。相反,考虑其他可以帮助未来用户找到所需答案的操作,如链接帖子中所述。 - Mogsdad
@Mogsdad 这不是重复的答案,这是一个不需要使用joda-time(对于简单功能可能不想下载它)并且无论日期如何都可以工作的答案。其他回答只有在两个答案在同一年或忽略夏令时等情况下才有效。 - Viviano Cantu
“重复”并不是指你在这个问题上重复了一个答案,而是你粘贴了自己从另一个问题中复制的重复内容。 如果这些“问题”是相同的,它们应该被标记为重复。如果不是,你的“答案”应该针对特定的问题进行调整。或者,适当的做法是在评论中链接到其他答案。 - Mogsdad

-1

public int diffInWeeks(Date start, Date end) { long diffSeconds = (end.getTime() - start.getTime())/1000; return (int)diffSeconds/(60 * 60 * 24 * 7); }

公共整数 diffInWeeks(日期开始,日期结束){     长diffSeconds =(end.getTime() - start.getTime())/ 1000;     返回(int)diffSeconds /(60 * 60 * 24 * 7); }

2
当时间间隔不完全是24小时,例如由于夏令时或闰秒等原因时,这将导致错误的结果。 - kaya3

-1
请看下面的文章:Java - 计算两个日期之间的差值 daysBetween方法可以让你得到两个日期之间相差的天数。然后你可以简单地除以7,就能得到完整周数的数量。

1
这是错误的 - 星期五和星期一之间是3天,但是一周。 - foal

-1
        Calendar date1 = Calendar.getInstance();
        Calendar date2 = Calendar.getInstance();

        date1.clear();
        date1.set(datePicker1.getYear(), datePicker1.getMonth(),
                datePicker1.getDayOfMonth());
        date2.clear();
        date2.set(datePicker2.getYear(), datePicker2.getMonth(),
                datePicker2.getDayOfMonth());

        long diff = date2.getTimeInMillis() - date1.getTimeInMillis();

        float dayCount = (float) diff / (24 * 60 * 60 * 1000);

        int week = (dayCount / 7) ;

希望这可以帮到你


1
此代码假设每天的持续时间都是毫秒级别相同的,但由于夏令时和闰秒的存在,实际情况并非如此,因此会导致错误的结果。 - Peter Walser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接